ArrayLists中的对象是否有任何引用?

时间:2016-12-11 16:41:33

标签: java arraylist

我创建了一个名为books的ArrayList,它只包含我创建的类LibraryBook。我在另一个名为Library的类中创建了它。

public class Library {

   ArrayList<LibraryBook> books;

   public Library() {
      books = new ArrayList<LibraryBook>();
   }

然后我在这个Library类中有一个方法,它将LibraryBooks添加到这个ArrayList。

public void add( String title, String author) {
  LibraryBook b = new LibraryBook( title, author);
  books.add( b);
}

所以,如果我说,在一个主要的方法;

Library library = new Library();
library.add( "Title", "Author");

我在ArrayList中获得了一个新的LibraryBook。但是,如果我再次这样做;

Library library = new Library();
library.add( "anotherTitle", "anotherAuthor");

现在我在ArrayList中有另一个LibraryBook。但是在add方法中,我让LibraryBook b引用了这些对象。那么现在指的是这些物体呢?它们都是由变量b引用的(就Java而言,它不应该发生)?或者他们根本没有任何参考?

我的猜测是,当我将一个对象放入一个ArrayList时,它会创建一个对该对象的引用并存储它。 如果我将对象的引用放入ArrayList中,它也会做同样的事情。

如果这是真的,那么另一个问题是,Java如何让我创建两个不同的LibraryBooks,在我的add方法中用相同的变量b引用?

编辑:在我发布这篇文章之前,我发现了另一个具有相同标题的帖子,但是我找不到我想要的答案,所以我们去了。

EDIT2:尽管如此,这个问题与链接帖子有什么关系?链接的帖子是如此“一般”,以至于该论坛中的任何帖子都可以链接到该帖子并被视为重复。它完全没有我的问题的答案。甚至单词ArrayList也不存在。除了链接帖子是Java基础知识的一般“教训”之外,我希望得到关于这两个帖子甚至是如何相关的反馈。

2 个答案:

答案 0 :(得分:3)

  

我的猜测是,当我将一个对象放入一个ArrayList时,它会创建一个对该对象的引用并存储它。如果我将对象的引用放入ArrayList中,它也会做同样的事情。

。当你说出类似的东西时。

libraryList.add(new LibraryBook("hello", "world"));

您实际上并未在列表中添加新对象new关键字返回新创建的对象的引用,而不是对象本身。所以说..

LibraryBook b = new LibraryBook("hello", "world");

并将其添加到列表中完全相同。实际上,编译器可能会删除不必要的变量b以在运行时节省内存分配。

  

如果这是真的,那么另一个问题是,Java如何让我创建两个不同的LibraryBooks,在我的add方法中用相同的变量b引用?

好问题!要理解这一点,您需要了解范围。如果我在函数内声明一个变量,就像这样:

public void myMethod() {
    String s = "hello";
    System.out.println(s);
}

当该方法退出时,引用(您称为s)将被销毁。如果不存在其他引用,则垃圾收集器会出现并销毁对象本身,因为没有任何引用它。

这意味着如果再次致电myMethod,则会创建参考。它们可能共享相同的代码块,但它们将作为系统中的两个互斥变量存在。

在您的情况下,因为您要在列表中添加对象,所以列表会保留对对象的引用,而垃圾收集器也不会删除它们,所以每次调用时都会生成新的b与先前调用该方法时所做的b的任何其他版本无链接的函数。

答案 1 :(得分:0)

如果查看你的添加方法,

public void add( String title, String author) {
  LibraryBook b = new LibraryBook( title, author);

&#39; B&#39;是一个方法局部变量(引用),一旦方法执行完成就会被销毁,但是对象仍然会在堆上。因此,每次调用此方法时,都会创建一个新对象,并且引用b将指向新创建的对象

    books.add( b);

这一行将把创建的对象的引用放到arraylist对象中,对象总是存储在堆中。因此,无论何时创建和对象,内存都在堆中分配,并且引用将存储在堆栈段中,并且一旦方法执行完成,帧将从堆栈中取出。 由于books是一个类级变量,因此对这些对象的引用将一直存在,直到Library对象被垃圾收集。