簡體   English   中英

刪除列表上的有效迭代器?

[英]Valid iterator on a removed list?

我寫了一些有效的代碼,但不確定。 考慮

LinkedList<Iterator<Integer>> iterators;
HashMap<Character, TreeSet<Integer>> map;
for (char c : map.keySet()) {
    iterators.add(map.get(c).iterator());
    map.remove(c);
}

即使原始TreeSet已被刪除,迭代器似乎也可以正常工作(即按照TreeSet的原始順序進行)。 我不太明白為什么它起作用了-好像這里是按值傳遞而不是按引用傳遞。 但是,很明顯,如果我要寫

map.get(c).add(6);

TreeSet實際上會在地圖中添加6(而不僅僅是在地圖中TreeSet的副本中添加6),表明get正在通過引用傳遞。 有人可以幫忙消除這里的困惑嗎?

HashMap刪除TreeSet不會破壞TreeSet ; 它只是刪除HashMap中對TreeSet的引用。 HashMap不包含副本TreeSet ,只是給一個參考TreeSet

首先:

{map} -----> {aTreeSet}
                  |
                  v
                 {6}

Iterator的目的是迭代某些東西。 在這種情況下,它遍歷邏輯方式TreeSet元素是保持其自己的參考TreeSet (或內的內部數據結構TreeSet )。 這些元素總是至少被一個強引用引用,因此它們永遠不會被垃圾收集。

創建Iterator

{map} -----> {aTreeSet} <----- {Iterator}
                  |
                  v
                 {6}

從地圖中刪除(以及添加到LinkedList ):

{map}        {aTreeSet} <----- {Iterator} <----- {iterators}
                  |
                  v
                 {6}

總而言之, TreeSet元素永遠不適合進行垃圾回收; 只有一個TreeSet對象,並且該對象的元素仍可用於迭代。

我閱讀了您的帖子5次,但仍無法理解混亂之處在哪里?

您是在問為什么從Map刪除條目后, iterators iterator中仍然有有效的iterator iterators 這就是Java中引用的工作方式...

線:

iterators.add(map.get(c).iterator());

c下創建對TreeSet新強引用,因此不會setset

當涉及傳遞引用與傳遞值時,沒有什么比C / C ++中已知的真正傳遞引用更重要 有關詳細信息,請單擊此處

當談到線:

map.get(c).add(6);

我不知道你是什么意思

TreeSet實際上會在地圖中添加6(而不僅僅是在地圖中的TreeSet的副本中添加6)

在地圖中復制TreeSet是什么意思? 復制什么? 它指向與iterator iterators指向的iterator iterators相同的TreeSet

暫無
暫無

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

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