在您的第一个代码中,是的,这一行
String str2 = str1;
分配
str2给所
String引用的
str1,即
"old"。在这一点上,它们是同一对象。但是,下一行
str1 = "new";
创建的 新 实例
String,并更改
str1对此新String 的引用。当我们更改的引用时
str1,的内容
str2不会更改。
注意Java
String是不可变的,即一旦初始化就无法更改状态。以这种方式思考,内容
"old"可能永远不会改变。因此,当您分配
"new"给时
str1,您不会更改的值
"old",而是创建一个新值
String。
换句话说,这条线在这里与
str1 = new String("new");http://i.minus.com/jboQoqCxApSELU.png
但是,在第二个代码中
List<Integer> list2 = list1;
使
list2与
list1。参考相同的清单。作为结果,
list1并
list2指向同一个列表。然后
list1.add(1);
将一个元素添加到所引用的列表中
list1。但是,正如我刚才所说,
list1并
list2表示相同的列表中,都
list1和
list2现在有元素
1。方法调用中没有创建新实例。
http://i.minus.com/jxDLyBqcUzgHZ.png
实际上,如果您要做
List<Integer> list1 = new ArrayList<Integer>();List<Integer> list2 = list1;list1 = new ArrayList<Integer>();list1.add(1);System.out.println(list1.size()); //1System.out.println(list2.size()); //0
因为
list1 = new ArrayList<Integer>();重新分配
list1到新列表,该列表不再引用所引用的对象
list2。
在所有 赋值运算符(即
obj1 = obj2)之后, 总是
复制引用,这两个引用在赋值后仍将引用同一对象实例。这适用于
String,
List或 任何其他类 (但不适用于原始类型)。
但是,
str1 ="new"在大多数情况下,将创建的新实例,
String然后将对新实例的引用分配
String给
str1-在Java语言中这是特例。这不适用于任何其他类型的对象。这与其他任何方法调用(例如)不同
list1.add(1)。



