如何对一个ArrayList使用add()会干扰另一个ArrayList的大小?

时间:2015-03-18 02:14:38

标签: java arraylist add

我创建了两个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?

8 个答案:

答案 0 :(得分:3)

问题是ab指向同一个对象。 您将原始值与对象引用混淆。当你运行这样的东西时:

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,ab都指向同一个东西。如果要创建单独的对象,则需要执行以下操作:

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都指向内存中的同一个对象

two variable referencing the same object

答案 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对象和两个变量指向该对象存储的内存。

因此,通过在任何变量ab上调用add方法,可以添加相同的ArrayList。