例如,在collection中加入一个String s。我们希望通过修改s来修改collection中对应位置的属性,就直觉看来这种做法完全是可行的,但实际是否满足这种情况呢?
例如代码:
String s1 = new String("abc");
List<String> list = new ArrayList<String>();
list.add(s1);
s1 = s1.concat("d");
System.out.println(list.get(0));
String s2 = s1.concat("e");
list.set(0, s2);
System.out.println(list.get(0));
我们认为其两次输出应该分别是“abcd”和“abcde”但是,实际是什么状况呢?
对于两次输出,实际上,第一次输出的结果是“abc”第二次结果为“abcde”为什么会出现这种现象呢?下面我们用snapshot diagram 进行解释。
产生这种现象的主要原因是,String为immutable的。每次进行更改或者引用都会进行一次复制。当我们修改s1的内容时,其并没有将对应内存空间的属性更改,而是在新的空间创建新的String。而collection仍然对应着原来未修改的空间。这也就造成了我们在一定程度上的困惑。