10

假设我的代码是这样的:

ArrayList list = new ArrayList();
Student s = new Student();    // creating object of Student class

myList.add(s);      // Here am confused ...

/* myList contains just the reference variable to the Student object, OR

   myList contains the actual Student object (memory allocation for name, rollNo etc)  ??   
*/

简而言之,使用 add() 将对象添加到 ArrayList 时:

ArrayList 是“对对象的引用”的列表或其“实际对象”的列表???

4

9 回答 9

15

在 Java 中,您永远不会传递实际对象。您总是在处理一个引用,它本质上只是一个指向内存中存储对象的位置的地址。

由于您从不使用实际对象,因此 ArrayLists 包含对存储在其他地方(内存中称为堆)的对象的引用数组。

于 2013-09-17T17:03:54.760 回答
4

对象存储在堆上,而不是数组列表的“内部”。正如您所说,arraylist 存储对找到对象的位置的引用。

于 2013-09-17T17:01:10.850 回答
4

ArrayList 存储对对象的引用。我建议您使用 ArrayList 的通用版本。您的声明将是:

ArrayList <Student> list = new ArrayList<>();

您将受益于编译时的类型检查。

另请阅读http://en.m.wikipedia.org/wiki/Object_copy以了解有关对象复制概念以及 Java 和 C++ 采用的不同策略的解释。

于 2013-09-17T17:00:33.540 回答
3

自身内部的对象ArrayList存储在堆上。ArrayList简单地提供对这些对象的引用,并且实例ArrayList也在堆上。

归根结底,对象引用只是内存中存储对象的位置的地址。因此,ArrayList 包含对存储在堆(或内存)中的对象的引用数组。

于 2013-09-17T17:02:47.113 回答
2

ArrayList存储对象的引用。

该片段将向您解释

public static void main(String[] args) {

    ArrayList<Dog> a=new ArrayList<TEST.Dog>();
    Dog d=new Dog("AL");

    a.add(d);
    d.setName("AFTER");

    System.out.println(a);
}

在这里,我们Dog在列表之外独立地更改对象,并且它被反映到列表中,因此引用被存储在列表中。

于 2013-09-17T17:07:44.573 回答
1

我知道这比必要的更具体,但是 Java 按值存储对象的引用。我会解释一下,但这里已经有一篇很好的文章:Java is Pass-by-Value, Dammit!.

Scott Stanchfield还对stackoverflow/reference-or-value添加了一些额外的说明。

于 2017-01-21T05:42:49.470 回答
0

取决于你如何看待它。但它始终是一个参考。

这是一个例子:

String niceText = "Hallo array List";
ArrayList<String> list = new ArrayList<String>();
list.add(niceText);
System.out.print(niceText + " = " + list.get(0));
// Output: Hallo array List = Hallo array List

niceText = "Goodby list";
System.out.print(niceText + " = " + list.get(0));
// Output: Goodby list = Goodby list

list.get(0) = "Still in here";
System.out.print(niceText + " = " + list.get(0));
// Output: Still in here = Still in here

list.add("New value");
System.out.print(niceText + " = " + list.get(1));
// Output: Still in here = New value
// But there is no referencing object anymore for index 1, it exist only in the list

但是您可以走得更远,通过克隆您的对象或以不同的方式将其传递给应用程序的其他组件。但这与数组列表无关,这就是 java 处理对象实例和可见性的方式。

于 2013-09-17T17:06:56.473 回答
0
        ArrayList<Dog> arrayList = new ArrayList<Dog>();
        Dog dogReference = new Dog("AL");
        arrayList.add(dogReference);

        System.out.println(arrayList.get(0)); //Dog@ObjectRef
        dogReference.setName("AFTER");

        dogReference = new Dog("NEWER");

        // This is still referencing old reference though we have re-initialized
        System.out.println(arrayList.get(0)); //Dog@ObjectRef
        System.out.println(arrayList.get(0).getName());     //AFTER
        System.out.println(dogReference.getName());        //NEWER

最初,我对这个例子感到困惑,因为在重新初始化相同的变量后arrayList仍然指向旧的变量。ArrayList用于Object[]存储引用。

于 2017-03-14T08:05:39.570 回答
-1

我会咬。这显然是一个关于 Java 中对象引用的更大问题的问题。询问为什么您需要知道您的对象是按引用存储还是按值存储可能会有所帮助。

这可能是要回答的更有趣的问题,因为 Java 中的大多数东西,除了原语和其他一些东西,都是通过引用存储的。在你需要思考为什么你的思维过程需要知道某件事是通过参考还是价值的时候,你更有可能解决任何促使你不得不问这个问题的问题问题。

只是好奇。

于 2013-09-17T19:09:31.383 回答