[英]Java Enhanced For-Loop: Referenced Collection Not Changed
发生了一件奇怪的事情,假设我的代码带有“附件”对象,并且我想将所有对象设置为NULL。
List<Attachment> attachments = getAttachments();
for (Attachment attachment: attachments)
{
attachment = null;
}
立即对象附件已成功设置为NULL。 但是支持集合没有被改变。 它仍然具有旧数据。 我以为我们总是可以依靠Java中的引用?
是的,如果您正确理解了引用,则可以依靠Java中的引用。 您有一个引用变量attachment
,但这是2个引用的引用之一,引用要设置为null
的对象。
attachments -> { Attachment, Attachment, Attachment }
| | |
v v v
attachment --> (object) (object) (object)
当为attachment
分配null
时,列表引用不会更改。
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
。 这将在列表中保留n个null
副本。 另一种方法是用删除所有引用到列表attachments.clear()
这将不留在引用列表中的所有,甚至不null
,如果这就是你真正想做的事情。
在增强的for循环中遍历Collection
的内容时,您无法对其进行修改。
您在每次迭代中获得的attachment
对象就像集合中对象的副本(实际上只是对该对象的另一个引用),因此,基本上,您是将null分配给该“临时”对象,而不是分配给对象中的实际元素采集。
将null分配给附件变量不能更改集合,因为附件是对附件对象的引用,而不是对集合本身的引用。
您的附件集合包含对附件对象的引用。 循环的每次迭代,Java都会将集合中的下一个对象引用分配给您的附件变量。 如果随后更改了附件变量,则不能更改集合本身。
增强的for
语句的标头中的标识符声明了一个局部变量 ,如Java语言规范中所述 。 在您的情况下, attachment
是局部变量。 将其设置为null
,它不会影响它指向的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.