不变对象String与可变对象StringBuilder:
在学习过程中,一开始没有弄清楚String的不变性的含义,误以为String s 一旦被赋值便无法改变,很困惑如下代码及其输出:
String s = "a";
System.out.println("s:" + s);
s += "b"; //s = s + "b" 或 s= s.concat("b") 也可以实现
System.out.println("s:" + s);
代码输出如下:
s:a
s:ab
后来仔细阅读教材,明白了String的不变性是指对象一旦被赋值便无法更改,而之所以上述3,4,5行代码可以成功修改s的值,是因为新建立了一个字符串ab,更改了s指向的对象,不变性是指对已经赋值的对象不能更改,需要通过新建一个对象实现,快照图如下:
再来看StringBuilder:
StringBuilder的可变性是指可以直接改变对象的值,代码及输出如下:
StringBuilder s = new StringBuilder("a");
System.out.println("s:" + s);
s.append("b");
System.out.println("s:" + s);
s:a
s:ab
对应的快照图如下:
对不可变类型的修改会产生大量临时拷贝(需要垃圾回收,浪费内存);并且在有多个引用时会产生错误,例如下列代码:
String s = "a";
String t = s;
System.out.println("s:" + s);
System.out.println("t:" + t);
s += "b";
System.out.println("s:" + s);
System.out.println("t:" + t);
t += "c";
System.out.println("s:" + s);
System.out.println("t:" + t);
s:a
t:a
s:ab
t:a
s:ab
t:ac
为什么会有以上输出呢,分析快照图即可:
再看下列代码及输出:
StringBuilder s = new StringBuilder("a");
StringBuilder t = s;
System.out.println("s:" + s);
System.out.println("t:" + t);
s.append("b");
System.out.println("s:" + s);
System.out.println("t:" + t);
t.append("c");
System.out.println("s:" + s);
System.out.println("t:" + t);
s:a
t:a
s:ab
t:ab
s:abc
t:abc
分析快照图:
以上,即是我对String与StringBuilder的可变性,不变性的理解与理解过程收获心得。
可变mutable:
提供了可以改变内部数据的操作
不可变immutable:
其操作不改变内部值,而是构造新对象
以上仅是本人个人学习的过程体会总结,如有错误,欢迎及时指出探讨!