[英]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.