首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 集合與迭代器關係深度解析:記憶體模型與刪除行為

     編輯:程式設計綜合問答

問題代碼回顧

HashSet<String> hs = new HashSet<>();
hs.add(\"java\"); hs.add(\"java\"); hs.add(\"c\"); hs.add(\"ios\");
Iterator<String> it = hs.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.equals(\"java\")) it.remove();
    System.out.println(s);
}
System.out.println(hs); System.out.println(hs.size());

三大疑問解答

疑問 1:迭代器與集合在記憶體中的關係?

迭代器是 輕量級遍歷工具物件,內部持有對集合內部結構的引用(如哈希表桶位索引、當前節點指標)。它 不複製元素,佔用極少記憶體(幾十位元組)。JVM 層面僅是一個普通物件實例,可透過 javap -c 查看位元碼確認。

疑問 2:it.remove() 後集合 size() 為何改變?

Iterator.remove() 是 唯一安全在遍歷過程中修改集合的方法。它直接操作底層資料結構(如移除哈希桶節點、調整鏈表指標),導致集合元素實際減少,故 size() 即時反映最新數量。

疑問 3:為何刪除後仍印出被刪元素,遍歷結束重印集合卻不見?

程式碼邏輯:String s = it.next(); 先將元素引用存入區域變數 s,隨後 呼叫 it.remove() 從集合移除。System.out.println(s); 印的是區域變數 s 持有的引用(物件尚未被 GC),而非從集合重新讀取。遍歷結束後再印 hs,集合已無該元素,自然不顯示。

關鍵總結

  • 迭代器是「游標」,非資料副本。
  • it.remove() 修改的是集合本體,即時生效。
  • 區域變數引用會延長物件生命週期,不代表集合仍包含該元素。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved