Java增强For循环:引用的集合未更改
有些奇怪的事情正在发生,假设我有一个带有“附件”对象的代码,我想将所有对象设置为NULLJava增强For循环:引用的集合未更改,java,Java,有些奇怪的事情正在发生,假设我有一个带有“附件”对象的代码,我想将所有对象设置为NULL List<Attachment> attachments = getAttachments(); for (Attachment attachment: attachments) { attachment = null; } List attachments=getAttachments(); 用于(附件:附件) { 附件=空; } 立即对象附件已成功设置为空。但支持收集是未被触及的
List<Attachment> attachments = getAttachments();
for (Attachment attachment: attachments)
{
attachment = null;
}
List attachments=getAttachments();
用于(附件:附件)
{
附件=空;
}
立即对象附件已成功设置为空。但支持收集是未被触及的。它仍然有旧的数据。我认为我们可以始终依赖Java中的引用?在增强的for循环中遍历集合时,不能修改其内容
每次迭代中得到的附件
对象就像集合中对象的副本(实际上只是对该对象的另一个引用),因此基本上是为该“临时”对象赋值null,而不是为集合中的实际元素赋值 在增强的for循环中遍历集合时,不能修改该集合的内容
每次迭代中得到的附件
对象就像集合中对象的副本(实际上只是对该对象的另一个引用),因此基本上是为该“临时”对象赋值null,而不是为集合中的实际元素赋值 是的,如果您正确理解Java中的引用,您可以依赖它们。您有一个引用变量附件
,但它是指向要设置为null
的对象的两个引用之一
attachments -> { Attachment, Attachment, Attachment }
| | |
v v v
attachment --> (object) (object) (object)
将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);
}
for(int i=0;i
顺便说一句,不清楚为什么要将所有元素设置为null
。这将在列表中留下n份null
。另一种方法是删除对带有附件的列表的所有引用。clear()
,这将在列表中完全不保留引用,甚至不保留null
,以防您真正想这样做。是的,如果您正确理解它们,您可以依赖Java中的引用。您有一个引用变量附件
,但它是指向要设置为null
的对象的两个引用之一
attachments -> { Attachment, Attachment, Attachment }
| | |
v v v
attachment --> (object) (object) (object)
将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);
}
for(int i=0;i
顺便说一句,不清楚为什么要将所有元素设置为null
。这将在列表中留下n份null
。另一种方法是删除对带有附件的列表的所有引用。clear()
,这将在列表中完全不保留引用,甚至null
,如果这是您真正想要做的。为附件变量赋值null不能改变集合,因为附件是对附件对象的引用,而不是集合本身
“附件”集合包含对附件对象的引用。每次循环迭代,Java都会将集合中的下一个对象引用分配给附件变量。如果随后更改附件变量,则无法更改集合本身。将null赋值给附件变量无法更改集合,因为附件是对附件对象的引用,而不是集合本身
“附件”集合包含对附件对象的引用。每次循环迭代,Java都会将集合中的下一个对象引用分配给附件变量。如果随后更改附件变量,则无法更改集合本身。增强的for
语句标题中的标识符声明了一个局部变量,如中所述。在您的情况下,附件
是一个局部变量。当您将其设置为null
时,它不会影响它所指向的对象。增强的for
语句头中的标识符声明了一个局部变量,如中所述。在您的情况下,附件
是一个局部变量。当您将其设置为null
时,它不会影响它所指向的对象。没有任何奇怪的事情发生。设置局部变量的值不会影响引用同一对象的其他变量;它不适用于需要在遍历列表或数组时替换其中元素的循环。@azurefrog它会影响其他变量,但在这种特殊情况下,它不会因为使用了foreach
。但是其他for循环可用吗?这只是增强型for each循环的特例?它不会影响另一个变量。如果您运行一个方法(例如,attachment.foo()
),那么您将影响另一个变量引用的对象,这与此不同。没有什么奇怪的事情发生。设置局部变量的值不会影响引用同一对象的其他变量;它不适用于需要在遍历列表或数组时替换其中元素的循环。@azurefrog它会影响其他变量,但在这种特殊情况下,它不会因为使用了foreach
。但是其他for循环可用吗?这只是增强型for each循环的特例?它不会影响另一个变量。如果您运行一个方法(例如,attachment.foo()
),那么您将影响另一个变量引用的对象,这与此不同。