假设我的代码是这样的:
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是“对象的引用”或其“实际对象”列表的列表
答案 0 :(得分:14)
在Java中,你永远不会传递实际的对象。您总是在处理引用,它实际上只是存储对象的内存中的一个地址。
由于您从不使用实际对象,因此ArrayLists包含对存储在其他位置(内存中称为堆的位置)的对象的引用数组。
答案 1 :(得分:4)
ArrayList存储对象的引用。我建议你使用ArrayList的通用版本。 您的声明将是:
ArrayList <Student> list = new ArrayList<>();
您将从编译时的类型检查中受益。
另请阅读http://en.m.wikipedia.org/wiki/Object_copy以获取有关对象复制概念的解释以及Java和C ++采用的不同策略。
答案 2 :(得分:4)
对象存储在堆上,而不是存储在arraylist中。正如你所说,arraylist存储对找到对象的位置的引用。
答案 3 :(得分:2)
ArrayList
中的对象本身存储在堆上。 ArrayList
只提供对这些对象的引用,ArrayList
实例也在堆上。
在一天结束时,对象引用只是存储对象的内存中的地址。因此,ArrayList包含对存储在堆(或内存)中的对象的引用数组。
答案 4 :(得分: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
对象独立地更改为列表的一侧,并将其反映到列表中,因此引用将存储在列表中。
答案 5 :(得分:1)
我知道这比必要的更具体,但是Java按值存储了Object的引用。我会解释一下,但这里已有一篇好文章:Java is Pass-by-Value, Dammit!。
Scott Stanchfield还在stackoverflow/reference-or-value上添加了一些额外的说明。
答案 6 :(得分: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 handels对象实例和可见性的方式。
答案 7 :(得分: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[]
来存储引用。
答案 8 :(得分:-1)
这可能是一个更有趣的问题,因为Java中的大多数内容,除了原语和其他一些内容,都是通过引用存储的。为了能够解决任何问题,您需要考虑为什么您的思维过程需要知道,如果某些内容是通过引用或价值更有可能的话提示你不得不问这个问题。
好奇。