[英]Can I change the inner structure of objects in a HashTable while iterating over it?
[英]While iterating over a collections of Java objects--how can I mutate current object?
我將使用迭代器來循環Java中的對象集合。 我對使用Iterator感到有點困惑(用於每個循環使用)。 假設我有這樣的代碼:
Iterator<Organization> orgIter = orgs.iterator();
while (orgIter.hasNext()) {
Organization orgObj = orgIter.next();
orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>()));
}
我創建一個新對象,然后更改對象內的字段。 我的計划是將我形成的原始對象設置為iteroter等於我創建的此對象的列表(列表未在上面顯示,但我只是發現我需要它)。
但是如果我不必創建一個新的Object來完成所有這些操作就會容易得多。 有沒有辦法可以獲得當前對象並改變它?
嘗試這個:
for(Organization org : orgs)
org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>());
如果迭代器迭代List
或Queue
實例,則限制較少。 只要您不更改列表的結構,就可以使用Iterator.next()
返回的對象執行任何操作。 當然,該特定對象的類應該允許它被修改,但我認為你可以添加必要的代碼......
另一方面,在不使Iterator對象失效的情況下允許的唯一列表結構修改是使用Iterator.remove()
刪除當前元素,順便Iterator.remove()
,這是一個可選操作。 如果您嘗試直接修改列表,那么迭代器將失效,下次您嘗試使用它時將得到ConcurrentModificationException
。
另外,如果要迭代Set
,則通常會受到更多限制:根據實際Set
實現的細節,您通常無法修改對象中的任意字段。 例如,一旦將對象插入HashSet
, hashCode()
返回的值就不會改變...
作為旁注,Java中for-each
循環只是使用Iterator
語法糖。 如果你不打算使用Iterator.remove()
,只需使用for-each
循環而不是explicity迭代器並完成它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.