我创建了两个ArrayList,我想向ArrayList a添加一些Integers。 在Java代码中我这样做了:
ArrayList < Integer > a = new ArrayList < Integer >();
ArrayList b = a;
a.add(new Integer(4));
b.add(new Integer(5));
a.add(new Integer(6));
a.add(new Integer(7));
System.out.println(a.size());
我的问题是为什么b.add(new Integer(5));
还将一个对象添加到ArrayList a?
答案 0 :(得分:3)
问题是a
和b
指向同一个对象。
您将原始值与对象引用混淆。当你运行这样的东西时:
int a = 10;
int b = a;
a = 15;
System.out.println("a = " + a);
System.out.println("b = " + b);
输出将是:
a = 15
b = 10;
当您使用基元(int,String,long,byte,double,boolean,short ...)时,您正在将该变量的值复制到另一个变量中,如上例所示。 b
查看a
的值,并将其分配给b
,创建两个单独的变量。
另一方面,你使用ArrayLists做了什么,因为它们是OBJECTS,a
和b
都指向同一个东西。如果要创建单独的对象,则需要执行以下操作:
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> b = new ArrayList<Integer>();
然后你会得到你想要的结果。
希望这会有所帮助。 =)
答案 1 :(得分:3)
考虑下面的图像,其中给出了Date对象的插图。变量声明(例如ArrayList<Integer> a
)会创建一个引用,然后在赋值运算符new ArrayList < Integer >();
现在,当您声明ArrayList b=a
时,您声明第二个名为b的引用被分配了与第一个引用相同的地址a。因此a和b都指向内存中的同一个对象
答案 2 :(得分:2)
ArrayList b = a;
从这里a和b都指向same memory
。所以两个对象都具有相同的值。
答案 3 :(得分:2)
a = new ArrayList<>();
a 指向内存地址为0x1234的对象(ArrayList实例)(地址已组成)。
b = a;
b 指向与 a 指向的地址相同的地址。
因此, a 或 b 上的每个操作都会影响内存中的同一个对象。因此,b.add(new Integer(5))
与a.add(new Integer(5))
答案 4 :(得分:1)
ArrayList b是对ArrayList a的引用。实际上只有一个列表有两个指针。
答案 5 :(得分:1)
Arraylist b引用了arraylist a。如果你想要拆分,请查看java的clone()方法。
答案 6 :(得分:1)
将a的值传递给b时。实际上,您将引用的值传递给对象。这意味着a和b指向数组。
答案 7 :(得分:1)
按原样解释代码:
ArrayList b = a;
在这一行上你创建了一个能够容纳ArrayList的变量,然后你创建了刚刚创建的b
变量指向a
,这是另一个能够容纳ArrayList的变量。
a
指向Arraylist对象(您在第一行创建的新ArrayList)。
不意味着在第二行之后你有两个ArrayLists。只有一个 ArrayList对象和两个变量指向该对象存储的内存。
因此,通过在任何变量a
或b
上调用add方法,可以添加相同的ArrayList。