当前位置: 代码迷 >> J2SE >> string类是不可变的类解决方法
  详细解决方案

string类是不可变的类解决方法

热度:91   发布时间:2016-04-23 19:56:45.0
string类是不可变的类
最近在按java讲义,里面说String类是不可变的类
但是为什么如下代码没有错呢?
                String str1="java";
str1=str1+"struts";
str1=str1+"spring";
谁能说一下为什么,顺带讲一下String是不可变类的含义
------解决思路----------------------
String类是不可变的类 主要是指 public final class String 
用了final修饰符 的类不能被重写。
具体参考 java Api

但你所说的 str1  是对象。

str1=str1+"struts";
str1=str1+"spring";

这两次操作  无非就是对  str1   重新赋值。与String 类  没关系的。
------解决思路----------------------
为什么要有错呢
------解决思路----------------------
不可变类其实例一旦被创建不能被修改。并没说其引用就被固定死在指定实例上了。+操作后会返回新的String对象,引用指向的对象变了。
------解决思路----------------------
引用:
Quote: 引用:

String类是不可变的类 主要是指 public final class String 
用了final修饰符 的类不能被重写。
具体参考 java Api

但你所说的 str1  是对象。

str1=str1+"struts";
str1=str1+"spring";

这两次操作  无非就是对  str1   重新赋值。与String 类  没关系的。
还是不大理解


你看看 final 的含义 就知道了
------解决思路----------------------
引用:
不可变类其实例一旦被创建不能被修改。并没说其引用就被固定死在指定实例上了。+操作后会返回新的String对象,引用指向的对象变了。

+1

String str1="java";
str1=str1+"struts";

这两条语句执行完后,内存里有两个字符串,“java”,“javastruts”,其中没有变量指向"java"了但它还在内存里,原来指向它的str1,现在指向了“javastruts”。
------解决思路----------------------
所谓String类是不可变类,是指这个类定义的变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,但引用变量所指向的对象中的内容还是可以改变的。

------解决思路----------------------
引用:
Quote: 引用:

为什么要有错呢
String是不可变类啊,怎么还能加长
当字符串追加时,内存会重新建一个String实例,这时候str1地址指向的并不是原来的那个字符串实例了。。。
------解决思路----------------------
String类型每进行一次操作就会new一个新对象。  String str1="java"; 是这样子的:new一个对象,内容是“java”,放在地址A1处,让变量str1指向这个A1地址。str1 = str1+" struts":new一个新对象,内容是“java struts”,放在一个新地址A2,让变量a指向A2。结果打印出来的自然是“java struts”了。这个时候地址A1处的内容还是“java”,没有变(String为不可变字符串是指这个意思)。另外,这个时候地址A1处的对象(“java”)由于没有变量指向它(变量a已经指向A2),永远无法访问了所以变成了垃圾,等待系统回收。
  相关解决方案