Java增强的For循环:引用的集合未更改

时间:2016-02-23 18:00:25

标签: java

有些奇怪的事情发生了,假设我的代码带有'Attachment'对象,我想将所有对象设置为NULL。

List<Attachment> attachments = getAttachments();

for (Attachment attachment: attachments)
{
   attachment = null;
}

立即对象附件已成功设置为NULL。但是支持系列没有受到影响。它仍然有旧数据。我以为我们总是可以依赖Java中的引用?

4 个答案:

答案 0 :(得分:8)

是的,如果您正确理解它们,您可以依赖Java中的引用。您有一个引用变量attachment,但它是引用您想要设置为null的对象的2个引用之一。

attachments -> { Attachment, Attachment, Attachment }
                     |           |           |
                     v           v           v
  attachment -->  (object)    (object)    (object)

null分配给attachment时,列表引用不会更改。

attachments -> { Attachment, Attachment, Attachment }
                     |           |           |
                     v           v           v
  attachment      (object)    (object)    (object)
      |
      v
    (null)

增强的for循环不允许您以这种方式更改列表内容。

您可以使用传统的for循环,并调用set

for (int i = 0; i < attachments.size; i++)
{
    attachments.set(i, null);
}
顺便说一句,目前还不清楚为什么要将所有元素都设置为null。这会在列表中留下null n 个副本。另一种方法是删除对attachments.clear()列表的所有引用,列表中根本不会引用任何引用,甚至null也不会引用,如果这是你真正想做的事情。

答案 1 :(得分:1)

在增强的for循环中遍历它时,无法修改Collection的内容。

每次迭代时得到的attachment对象就像集合中对象的副本(它实际上只是对该对象的另一个引用),所以基本上你要为该'临时'对象赋值为null,不是集合中的实际元素。

答案 2 :(得分:0)

为附件变量赋值null不能改变集合,因为附件是对Attachment对象的引用,而不是对集合本身的引用。

您的附件集合包含对附件对象的引用。循环的每次迭代,Java都会将集合中的下一个对象引用分配给附件变量。如果您随后更改了附件变量,则无法更改集合本身。

答案 3 :(得分:0)

增强型 /** * @param string $context * @return ProxyQueryInterface */ public function createQuery($context = 'list') { $query = parent::createQuery($context); $query->leftJoin('o.followUpNews', 'fun') ->addSelect('COALESCE(fun.importDate, o.importDate) AS HIDDEN sortDate') ->addOrderBy('sortDate'); return $query; } 语句标头中的标识符声明局部变量,如Java Language Specification中所述。在您的情况下,for是一个局部变量。当您将其设置为attachment时,它不会影响它指向的对象。