簡體   English   中英

Java增強型循環:引用集合未更改

[英]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 這將在列表中保留nnull副本。 另一種方法是用刪除所有引用到列表attachments.clear()這將不留在引用列表中的所有,甚至不null ,如果這就是你真正想做的事情。

在增強的for循環中遍歷Collection的內容時,您無法對其進行修改。

您在每次迭代中獲得的attachment對象就像集合中對象的副本(實際上只是對該對象的另一個引用),因此,基本上,您是將null分配給該“臨時”對象,而不是分配給對象中的實際元素采集。

將null分配給附件變量不能更改集合,因為附件是對附件對象的引用,而不是對集合本身的引用。

您的附件集合包含對附件對象的引用。 循環的每次迭代,Java都會將集合中的下一個對象引用分配給您的附件變量。 如果隨后更改了附件變量,則不能更改集合本身。

增強的for語句的標頭中的標識符聲明了一個局部變量 ,如Java語言規范中所述 在您的情況下, attachment是局部變量。 將其設置為null ,它不會影響它指向的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM