我最近想要更熟悉java。我遇到一个问题,我在网上找不到答案。我想知道java何时向arraylist添加元素,是与变量名相关联的添加元素?例如,在以下代码中:
E obj1 = new E();
E obj2 = new E();
List myList = new ArrayList<E>();
myList.add(obj1);
obj1 = obj2;
对obj1的新赋值是否会在myList更改中存在值?
答案 0 :(得分:4)
不,将对象添加到List
时,引用会被复制,因此当您为obj1
分配新值时,列表将包含旧值。
答案 1 :(得分:2)
在Java中,它是“所有关于引用”。
使用new
时,仅创建新实例。
在所有其他作业中,例如obj1 = obj2
,您只是将参考更改为实际的实例。
此规则的唯一例外是涉及原始类型的分配,例如char
和int
。
执行myList.add(obj1)
时,在myList
中添加一个条目,其中包含对obj1
引用的实例的引用。
此时,此实例有两个引用(一个引用obj1
,另一个引用myList
中的条目。)
当你做obj1 = obj2
时,同一个实例只剩下一个引用(在myList
中)。
当实例的引用数变为0时,它将被垃圾回收器删除。
答案 2 :(得分:1)
不,在你的情况下,obj1不会在ArrayList中改变,因为在将obj1更改为obj2之前已经将obj1添加到ArrayList。
答案 3 :(得分:0)
ArrayList与Array相同,不包括其动态扩展功能。
ArrayList是容器,在内部它有一个数组,它存储对象引用。
myList.add(obj1);
这会将参考值
obj1 = obj2;
这不会影响列表中的任何更改。
答案 4 :(得分:0)
在obj1 = obj2;
之后,对象E的第一个实例被销毁,因为obj1和obj2都指向同一个实例(来自第2行E obj2 = new E();
的实例)。
答案 5 :(得分:0)
Java始终是按值传递的。这意味着在传递它之前,原始变量永远不会被您调用的方法/对象/等内部所做的任何更改。
然而,让人们感到困惑的是,当您传递一个对象时,您实际上是按值传递对该对象的引用。
这就是给你行为的原因。
您已将对象的引用传递到列表中。引用已按值传递。这意味着它已被复制,您可以根据需要更改引用(但不是它指向的内容),并且您调用的方法不会发生任何更改。
答案 6 :(得分:0)
在回答这个问题之前,首先要记住的是,无论何时遇到对象都被分配给另一个对象,您需要考虑该引用就像对象的远程控制一样。但是如果将对象分配给另一个对象,则您的引用(远程控制)不再控制您的对象。
让我们一行一行地看看发生了什么:
E obj1 = new E();
// the obj1 is created and holds reference to a memory location let's say 1a2s3d
E obj2 = new E();
// the obj2 is created and holds reference to say 5g5g5g5 .
List myList = new ArrayList<E>();
// empty list created acception elements of type E
myList.add(obj1);
//myList now points to reference 1a2s3d by addition of obj1 .
obj1 = obj2
//obj1 and obj2 now point to same reference .. 5g5g5g5
and myList still points to reference 1a2s3d because it points to reference not obj1.
So its value will not change.
Also any new changes to elements of obj1 or obj2 like setting value of any field in obj1 of class
E will change value of that field in obj2 also . thus the code is (obj1==obj2) ?? will return true.
答案 7 :(得分:0)
obj1
包含对类E实例的引用。当您将对象“添加”到列表中时,您将添加对它的引用,以便列表知道谁是新的伙伴。
在制作obj1 = obj2
时,您要更改obj1的值,而不是实例本身,以便两个变量都指向相同的E实例。
对象变量只是一个引用,因此您只需更改引用。因此,您使用
创建的实例E obj1 = new E();
仍然活着,根本没有改变。
通过分配对象变量,您永远不会更改对象本身而是更改引用。
注意:如果实例仍未被某个变量指向,则java的垃圾收集器将将其删除。情况并非如此,因为列表现在指出了实例。