public static void main(String[] args) {
Integer a = 1;
Integer b = 0;
b=a;
System.out.println(a);
System.out.println(b);
++a;
System.out.println(a);
System.out.println(b);
}
输出:1
1
2
1
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> b = new ArrayList<Integer>();
a.add(1);
a.add(1);
a.add(1);
a.add(1);
b=a;
System.out.println(a.size());
System.out.println(b.size());
b.add(2);
System.out.println(a.size());
System.out.println(b.size());
}
输出:4 4 五 5
对于上面的代码,为什么两个对象都没有引用相同的内存位置。
答案 0 :(得分:3)
这是因为Integer是不可变的。创建后,您无法更改它。如果要强制更改值,它将指向新的内存位置。完成++a
后,a
成为新对象。
从String的角度来看它可能会更容易。 (字符串也是不可变的)
String s1 = "aaa";
String s2 = s1;
s1 = "bbb";
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
<强>输出:强>
s1: bbb
s2: aaa
答案 1 :(得分:3)
所有包装类实际上都是Java不可变的。我们知道String是一个着名的不可变类。除此之外,像Integer这样的其他包装器也是不可变的。
答案 2 :(得分:2)
Integer a = 1;
Integer b = 0;
b=a;
System.out.println(a);
System.out.println(b);
if(a == b){
System.out.println("Both objects are equal");
}
++a;
if(a != b){
System.out.println("Both objects are different");
}
System.out.println(a);
System.out.println(b);
答案 3 :(得分:1)
案例-1:
public static void main(String[] args) {
Integer a = 1;
Integer b = 0;
b=a; // 2 references a and b point to same Integer object
System.out.println(a);
System.out.println(b);
++a; // now a references to a new integer object with value 2 where as b refers to old integer object with value 1
System.out.println(a);
System.out.println(b);
}
案例2:
同样,a
和b
都引用并处理相同的 arrayList实例。因此,使用一个引用进行修改也会反映在其他引用中
答案 4 :(得分:0)
++a
创建一个新对象=a+1
,然后设置a =
这个新对象。 b
未更改,因为赋值不会影响正在重新分配的变量中包含的对象。
另一方面,.add(2)
将2
添加到a
指定的列表中,该列表与b
指定的列表相同,因为它们已被等同。