对一个 ArrayList 使用 add() 如何影响另一个 ArrayList 的大小?
How does using add() to one ArrayList interfere the size of the other one?
我创建了两个ArrayList,我想添加一些整数到ArrayList a。
在 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 添加一个对象?
ArrayList b = a;
从这里 a 和 b 都指向 same memory
。所以两个对象具有相同的值。
ArrayList b 是对 ArrayList a 的引用。实际上只有一个列表有两个指向它的指针。
数组列表 b 正在引用数组列表 a。如果您想要拆分,请查找 java 的 clone() 方法。
当你将a的值传递给b时。您实际上将引用的值传递给对象。这意味着 a 和 b 指向数组。
a = new ArrayList<>();
a指向内存地址0x1234处的一个对象(一个ArrayList实例)(地址是虚构的)
b = a;
b 指向与 a 指向相同的地址。
所以对 a 或 b 的每个操作都会影响内存中的同一个对象。因此 b.add(new Integer(5))
与 a.add(new Integer(5))
的结果相同
问题是 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
创建两个单独的变量。
另一方面,由于它们是 OBJECTS,因此 a
和 b
都指向同一事物。如果你想创建单独的对象,你需要做:
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> b = new ArrayList<Integer>();
那么你会得到你想要的结果。
希望这对您有所帮助。 =)
考虑下图,其中的插图是用 Date 对象给出的。诸如 ArrayList<Integer> a
之类的变量声明会创建一个引用,然后在赋值运算符 =
[=15 的帮助下,将语句 new ArrayList < Integer >();
右侧部分创建的对象的地址分配给该引用=]
现在,当您声明 ArrayList b=a
您是在声明名为 b 的第二个引用被分配了与第一个引用 a 相同的地址。因此 a 和 b 都引用内存中的同一个对象
按原样解释代码:
ArrayList b = a;
在这一行中,您创建了一个能够保存 ArrayList 的变量,并将您刚刚创建的这个 b
变量指向 a
,这是另一个能够保存 ArrayList 的变量。
a
指向 Arraylist 对象(您在第一行创建的新 ArrayList)。
这 而不是 意味着在第二行之后你有两个 ArrayList。只有一个 ArrayList 对象和两个 指向存储此对象的内存的变量。
因此,通过对任何变量 a
或 b
调用 add 方法,您可以在同一个 ArrayList 上添加。
我创建了两个ArrayList,我想添加一些整数到ArrayList a。 在 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 添加一个对象?
ArrayList b = a;
从这里 a 和 b 都指向 same memory
。所以两个对象具有相同的值。
ArrayList b 是对 ArrayList a 的引用。实际上只有一个列表有两个指向它的指针。
数组列表 b 正在引用数组列表 a。如果您想要拆分,请查找 java 的 clone() 方法。
当你将a的值传递给b时。您实际上将引用的值传递给对象。这意味着 a 和 b 指向数组。
a = new ArrayList<>();
a指向内存地址0x1234处的一个对象(一个ArrayList实例)(地址是虚构的)
b = a;
b 指向与 a 指向相同的地址。
所以对 a 或 b 的每个操作都会影响内存中的同一个对象。因此 b.add(new Integer(5))
与 a.add(new Integer(5))
问题是 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
创建两个单独的变量。
另一方面,由于它们是 OBJECTS,因此 a
和 b
都指向同一事物。如果你想创建单独的对象,你需要做:
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> b = new ArrayList<Integer>();
那么你会得到你想要的结果。
希望这对您有所帮助。 =)
考虑下图,其中的插图是用 Date 对象给出的。诸如 ArrayList<Integer> a
之类的变量声明会创建一个引用,然后在赋值运算符 =
[=15 的帮助下,将语句 new ArrayList < Integer >();
右侧部分创建的对象的地址分配给该引用=]
现在,当您声明 ArrayList b=a
您是在声明名为 b 的第二个引用被分配了与第一个引用 a 相同的地址。因此 a 和 b 都引用内存中的同一个对象
按原样解释代码:
ArrayList b = a;
在这一行中,您创建了一个能够保存 ArrayList 的变量,并将您刚刚创建的这个 b
变量指向 a
,这是另一个能够保存 ArrayList 的变量。
a
指向 Arraylist 对象(您在第一行创建的新 ArrayList)。
这 而不是 意味着在第二行之后你有两个 ArrayList。只有一个 ArrayList 对象和两个 指向存储此对象的内存的变量。
因此,通过对任何变量 a
或 b
调用 add 方法,您可以在同一个 ArrayList 上添加。