簡體   English   中英

HashMap,其中鍵的順序很重要

[英]HashMap where the order of keys is important

我使用 HashMaps 來存儲對的集合,但我還必須確保從第一個 json 序列化(來自 Php 客戶端)到 Java HashMap 集合瀏覽,鍵的順序將是相同的

//import com.google.gson.Gson;
//import com.google.common.base.Joiner;  
String s = "{\"durant\":\"kevin\", \"james\":\"lebron\",\"harden\":\"james\",\"westbrook\":\"russel\"}";
System.out.println(s);
Gson gson = new Gson();
Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> m = gson.fromJson(s, typeOfMap);
List<String> entries = new ArrayList< String>(m.keySet());
//Collections.sort(entries);
System.out.println(entries);
System.out.println(m.entrySet());
System.out.println( Joiner.on(",").withKeyValueSeparator("").join(m) );

它似乎適用於一小組值,無需再次排序(此處按字母順序排列),但這是一種可靠的方法嗎? json String 和 Map 瀏覽之間的順序可以改變嗎?

編輯:可能 LinkedHashMap 更能保留順序?

LinkedHashMap維護插入順序。 除此之外,還有各種SortedMap實現,例如TreeMap

您可以在 SO 上查看這個問題: Java 如何對 HashMap 或 HashTable 中的項目進行排序?

可以給你更清晰的圖...

從該圖表中,您可以看到與 Java 11 捆綁在一起的Map的各種實現之間的不同行為。請注意“迭代順序”列。

Java 11 中的地圖實現表,比較它們的特性

如果您希望地圖根據鍵的值進行排序來維護順序,請使用實現SortedMap或其后繼NavigableMap 這意味着TreeMap ,或者如果您需要並發, ConcurrentSkipListMap

如果要保持原始插入順序,請使用LinkedHashMap

如果您將枚舉對象作為鍵,請使用EnumMap來維護鍵,以便定義枚舉。

與 Java 11 捆綁在一起的所有其他Map實現都沒有承諾鍵的順序,因此請避免使用它們。 您還可以考慮使用Map 3rd 方實現,例如在Google Guava庫中找到的那些。

暫無
暫無

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

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