Java ArrayList实际存储的是什么-对对象或实际对象的引用?

Java ArrayList实际存储的是什么-对对象或实际对象的引用?,java,arraylist,Java,Arraylist,假设我的代码是这样的: 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

假设我的代码是这样的:

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是一个“对对象的引用”列表,或者是一个“实际对象”列表???

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

ArrayList <Student> list = new ArrayList<>();
ArrayList list=new ArrayList();
您将从编译时的类型检查中获益


也阅读了关于对象拷贝概念的解释和java和C++采用的不同策略。

对象存储在堆上,而不是存储在数组中。正如您所说,arraylist存储指向找到对象的位置的引用。

arraylist中的对象本身存储在堆中。
ArrayList
只是提供对这些对象的引用,而
ArrayList
实例也在堆中


一天结束时,对象引用只是指向内存中存储对象的位置的地址。因此,ArrayList包含对存储在堆(或内存)中的对象的引用数组。

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


由于您从不使用实际对象,ArrayList包含对存储在其他位置(内存中称为堆的位置)的对象的引用数组。

取决于您如何看待它。 但它总是一个参考

以下是一个例子:

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
String niceText=“Hallo数组列表”;
ArrayList=新建ArrayList();
列表。添加(文本);
系统输出打印(niceText+“=”+list.get(0));
//输出:Hallo数组列表=Hallo数组列表
niceText=“Goodby list”;
系统输出打印(niceText+“=”+list.get(0));
//输出:Goodby list=Goodby list
list.get(0)=“仍然在这里”;
系统输出打印(niceText+“=”+list.get(0));
//输出:仍在此处=仍在此处
列表。添加(“新值”);
System.out.print(niceText+“=”+list.get(1));
//输出:仍在此处=新值
//但是索引1不再有引用对象,它只存在于列表中
但你可以更进一步,通过克隆你的对象或以不同的方式将其传递给应用程序的其他组件。
但这与数组列表无关,这是java处理对象实例和可见性的方式。

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);
}
publicstaticvoidmain(字符串[]args){
ArrayList a=新的ArrayList();
狗d=新狗(“AL”);
a、 加(d);
d、 设置名称(“之后”);
系统输出打印项次(a);
}

在这里,我们将把
Dog
对象独立地更改到列表的外侧,它将被反映到列表中,因此列表中存储了一个引用。

我将咬一口。这显然是由Java中对象引用的更大问题引起的问题。问一下为什么需要知道对象是通过引用还是通过值存储,也许会有所帮助

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


只是好奇。

我知道这比必要的更具体,但Java通过值存储对象的引用。我想解释一下,但这里已经有一篇好文章了:

还添加了一些额外的说明。

ArrayList ArrayList=new ArrayList();
狗参考=新狗(“AL”);
arrayList.add(dogReference);
System.out.println(arrayList.get(0))//Dog@ObjectRef
dogReference.setName(“之后”);
dogReference=新狗(“较新”);
//这仍然引用旧引用,尽管我们已重新初始化
System.out.println(arrayList.get(0))//Dog@ObjectRef
System.out.println(arrayList.get(0.getName())//之后
System.out.println(dogReference.getName())//更新的

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

Java对象总是按引用传递。@SLaks您的意思是存储引用,但当通过方法传递对象时是按引用传递value@LuiggiMendoza:您的意思是按值传递引用。我们如何向myList动态添加对象?我不知道在运行时会创建多少个对象。显然我们不能接受s1,s2。。。在编程过程中。可以通过创建引用变量s[]的数组并使用类似myList.add(s[i])的内容来实现动态分配吗。。。每次创建一个新对象??请参见:我相信当创建一个ArrayList时,它最初会得到10个元素,但随着对象引用数量的增加,它会得到更多内存。这是不正确的。第二部分将打印“Goodby list=Hallo array list”而不是“Goodby list=Goodby list”
        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