如何将对象添加到数据结构中 - 只是添加了它们的参考?

时间:2011-06-14 16:23:56

标签: java

将对象添加到数据结构时,始终会添加对象的引用,而不是对象本身。那么下面的代码片段基本上是一样的吗?

Snippet 1 - 
    Object objectRef = new Object();   
    Vector vector = new Vector();
    vector.add(objectRef);
    Object object = (Object)vector.get(0);

Snippet 2 -
    Vector vector = new Vector();
    vector.add(new Object());
    Object object = (Object)vector.get(0);

5 个答案:

答案 0 :(得分:3)

Java总是按值传递引用。因此,无论何时使用引用作为函数调用的参数,引用值都是复制。对象本身未传递,其引用的副本是。理解它是一个重要的区别。同样重要的是要理解,通过引用,您(或库)仍然可以对通过其引用传递的对象进行操作。

您的摘要并不完全相同。在(1)中,您最终会对同一个对象objectRefobject进行两次引用。在(2)中,您最终只得到object。在这两种情况下,向量都有一个不同的对象的引用。

答案 1 :(得分:0)

两个片段是相同的,唯一的区别是你有一个名为objectRef的位置变量,它可以在添加到矢量后修改,如果它被修改,它将反映在从矢量返回的对象中因为它是同一个对象。虽然“Object”类并没有任何可以修改对象的方法。

答案 2 :(得分:0)

这是对的。在java编程语言中只有堆。每一个物体都存在于魔法堆地。每个非原始值只是一个指针,其唯一的操作是取消引用。可以将List视为字符串指针列表,字符串的实际数据内容在堆上,而不是在集合结构中。

(这当然是语言的语义。现代运行时没有义务以这种方式实际执行它,JIT使用方法堆栈,它只需要表现得就像它以这种方式工作一样。)< / p>

答案 3 :(得分:0)

它们导致相同的状态,除了在代码段2的末尾,您没有名为objectRef的符号。

答案 4 :(得分:0)

两个片段都给出了相同的结果。不同之处在于,在第一个代码段中,您有三个对同一对象的引用(objectRefobjectvector中的引用),而在第二个代码段中,您只有两个引用相同的对象(objectvector中的引用)。