one*_*ece 7 java string reference list
我做了两次测试,第一次开始 Strings
String str1 = "old";
String str2 = str1;
str1 = "new";
System.out.println(str1); //new
System.out.println(str2); //old
Run Code Online (Sandbox Code Playgroud)
上面的例子表明了这一点 str2 = str1, by value
现在我做类似的操作,但这一次 Lists
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = list1;
list1.add(1);
System.out.println(list1.size()); //1
System.out.println(list2.size()); //1
Run Code Online (Sandbox Code Playgroud)
这个例子表明了 list2 = list1, by reference
我很困惑,which Java variables/objects被过去了value,哪些是通过的reference?
在你的第一个代码中,是的,这一行
String str2 = str1;
Run Code Online (Sandbox Code Playgroud)
分配str2给相同String的str1,即"old"。在这一点上,它们是同一个对象。但是,下一行
str1 = "new";
Run Code Online (Sandbox Code Playgroud)
创建 的新实例String,并将 的引用更改str1为这个新字符串。当我们改变 的引用时str1, 的内容str2没有改变。
注意 Java, Strings 是不可变的,即一旦初始化就不能改变状态。这样想,内容"old"可能永远不会改变。因此,当您分配"new"给 时str1,您不会更改 的值"old",而是创建一个新的值String。
换句话说,这里的这一行与
str1 = new String("new");
Run Code Online (Sandbox Code Playgroud)
http://i.minus.com/jboQoqCxApSELU.png
但是,在第二个代码中,
List<Integer> list2 = list1;
Run Code Online (Sandbox Code Playgroud)
makelist2引用与 相同的列表list1。结果,list1和list2引用相同的列表。然后
list1.add(1);
Run Code Online (Sandbox Code Playgroud)
将一个元素添加到由 引用的列表中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()); //1
System.out.println(list2.size()); //0
Run Code Online (Sandbox Code Playgroud)
因为list1 = new ArrayList<Integer>();重新分配list1给一个新列表,该列表不再引用list2.
毕竟赋值运算符(即obj1 = obj2)总是复制引用,这两个引用在赋值后仍然会引用同一个对象实例。这适用于String、List或任何其他类(但不是原始类型)。
但是,str1 = "new"在大多数情况下,会创建一个新的实例,String然后将引用分配给新的Stringto str1- 这是 Java 语言中的一个特例。这不适用于任何其他类型的对象。这与任何其他方法调用(如list1.add(1).
| 归档时间: |
|
| 查看次数: |
4524 次 |
| 最近记录: |