簡體   English   中英

使用values()方法獲取LinkedHashMap中條目的LinkedList

[英]Get LinkedList of entries from LinkedHashMap with values() method

我試圖了解我是否可以從鏈接的哈希映射中獲取條目的鏈接列表。 我可以獲取entrySet()然后使用迭代器我通過插入順序中的每個條目。 這將為我提供插入順序中的條目鏈接列表。

如果我使用values()方法,可以保證相同的結果嗎?

從Java 8開始,我們來看看LinkedHashMap的來源。 我們可以從entrySet()values()方法定義中扣除內部行為:

  • 方法entrySet()在第627行返回new LinkedEntrySet() ,它使用new LinkedEntryIterator()作為第634行的迭代器。
  • 方法values()在第581行返回new LinkedValues() ,它使用new LinkedValueIterator()作為第588行的迭代器。

現在,讓我們看一下從第737行開始在同一個文件中定義的內部類的來源:

final class LinkedValueIterator extends LinkedHashIterator
    implements Iterator<V> {
    public final V next() { return nextNode().value; }
}

final class LinkedEntryIterator extends LinkedHashIterator
    implements Iterator<Map.Entry<K,V>> {
    public final Map.Entry<K,V> next() { return nextNode(); }
}

它們都擴展了LinkedHashIterator ,這意味着使用entrySet()values()將以相同的方式處理對map的值的訪問。

如果我使用values()方法,可以保證相同的結果嗎?

基本上, LinkedHashMap#values返回內部結構的受限視圖。 我敢說它必須給出相同的結果。 它沒有在文檔中明確說明

返回此映射中包含的映射的Set視圖。 該集由地圖支持,因此對地圖的更改將反映在集中,反之亦然

但突出顯示的摘錄讓我這么認為。

“相同的結果”不僅僅是數據集合:它包括數據應該迭代的方式(迭代器)。 “對映射的更改反映在集合中”對我來說意味着兩個迭代器共享一個算法,這個算法在同一條數據上會產生相同的行為。

我認同。 在內部,類使用java.util.LinkedHashMap.LinkedHashIterator ,它由entrySet()values() ,因此如果前者允許您按插入順序進行迭代,則后者將執行相同的操作。

暫無
暫無

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

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