Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java增强For循环:引用的集合未更改_Java - Fatal编程技术网

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

Java增强For循环:引用的集合未更改,java,Java,有些奇怪的事情正在发生,假设我有一个带有“附件”对象的代码,我想将所有对象设置为NULL List<Attachment> attachments = getAttachments(); for (Attachment attachment: attachments) { attachment = null; } List attachments=getAttachments(); 用于(附件:附件) { 附件=空; } 立即对象附件已成功设置为空。但支持收集是未被触及的

有些奇怪的事情正在发生,假设我有一个带有“附件”对象的代码,我想将所有对象设置为NULL

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()
),那么您将影响另一个变量引用的对象,这与此不同。