ArrayList和Integer都是对象数据类型,但是为什么下面的代码对两者的处理方式不同呢? ar,br,a 和 b 都是对象。 改变ar会改变br,但改变a并没有改变b,为什么? ArrayList 和 Integer 不都是对象吗?通过使用 = 语句将一个对象分配给另一个对象只是简单地浅复制 FOR BOTH 吗?或不?
import java.util.ArrayList;
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
ArrayList <Integer> ar = new ArrayList<>(Arrays.asList(1,2,3));
ArrayList<Integer> br = ar;
System.out.println(Arrays.toString(br.toArray()));// [1,2,3]
ar.remove(0);// lets change ar
// now lets see if br changed too
System.out.println(Arrays.toString(br.toArray()));// [2,3] (yes did)
Integer a= new Integer (5);
Integer b = a;
a = a+1;// lets change a and see if b changed too
System.out.println(b);// b is still 5
//So changing ar changed br too, but changing a did not change b why? Ist it both br and b are objects?
}
}
最佳答案
这是因为 Integer 对象实际上是 boxed基元。当您调用Integer a= new Integer (5);
时,您创建一个新的整数。当您执行Integer b = a;
时,则 b 引用与 a 相同的 Integer 实例。
当您调用a = a+1;
时,会发生以下情况:
- a 被拆箱为原语
int
值为 5。 - 加一的结果
int
已评估。 - 结果 6 被装箱到一个新的
Integer
中。其值为 6。原始整数值 5 不会被修改。
对于列表,您将分配 ar
和br
引用 java.util.ArrayList
的相同实例。当您通过 ar
访问该数组列表时,会看到对该数组列表的修改。和br
。
关键点是 a = a+1
构造一个新的java.lang.Integer()
通过拆箱、评估、装箱,同时ar.remove(0);
影响该列表而不创建它的新副本。
更多 JLS 阅读:
If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that
r.intValue() == p
关于java - 是什么导致java以不同的方式对待ArrayList和Integers这两种对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25817830/