【java】各種Map中keySet()返回值的排序問題
阿新 • • 發佈:2018-12-11
上回說到,由於對資料進行處理的時候是按照亂序一行一行的處理,導致並行執行緒各自佔據了一部分資料,誰也不肯釋放,從而發生死鎖。
為什麼會亂序,是因為取得資料行主鍵的時候,使用了HashMap.keySet()方法,而這個方法返回的Set結果,裡面的資料是亂序排放的。
JavaDoc裡面沒有詳細地解釋,所以用程式碼進行了一下嘗試
package test920; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.TreeMap; public class MapTest { public static void main(String[] args) { MapTest.hashtable(); System.out.println("\n---------------------------------"); MapTest.treeMap(); System.out.println("\n---------------------------------"); MapTest.hashMap(); System.out.println("\n---------------------------------"); MapTest.linkedHashMap(); } public static void hashtable() { ///////////////////////////////////////////////////////////// // TEST ///////////////////////////////////////////////////////////// System.out.println("## Hashtable ##"); Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("1", "OOO"); ht.put("3", "OOO"); ht.put("2", "OOO"); ht.put("5", "OOO"); ht.put("4", "OOO"); Iterator<String> it = ht.keySet().iterator(); while (it.hasNext()) { System.out.print(it.next() + "\t"); } } public static void treeMap() { ///////////////////////////////////////////////////////////// // TEST ///////////////////////////////////////////////////////////// System.out.println("## TreeMap ##"); TreeMap<String, String> tm = new TreeMap<String, String>(); tm.put("1", "OOO"); tm.put("3", "OOO"); tm.put("2", "OOO"); tm.put("5", "OOO"); tm.put("4", "OOO"); Iterator<String> it = tm.keySet().iterator(); while (it.hasNext()) { System.out.print(it.next() + "\t"); } } public static void hashMap() { ///////////////////////////////////////////////////////////// // TEST ///////////////////////////////////////////////////////////// System.out.println("## HashMap ##"); HashMap<String, String> hm = new HashMap<String, String>(); hm.put("1", "OOO"); hm.put("3", "OOO"); hm.put("2", "OOO"); hm.put("5", "OOO"); hm.put("4", "OOO"); Iterator<String> it = hm.keySet().iterator(); while (it.hasNext()) { System.out.print(it.next() + "\t"); } } public static void linkedHashMap() { ///////////////////////////////////////////////////////////// // TEST ///////////////////////////////////////////////////////////// System.out.println("## linkedHashMap ##"); LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>(); lhm.put("1", "OOO"); lhm.put("3", "OOO"); lhm.put("2", "OOO"); lhm.put("5", "OOO"); lhm.put("4", "OOO"); Iterator<String> it = lhm.keySet().iterator(); while (it.hasNext()) { System.out.print(it.next() + "\t"); } } }
結果:
## Hashtable ## 5 4 3 2 1 --------------------------------- ## TreeMap ## 1 2 3 4 5 --------------------------------- ## HashMap ## 1 2 3 4 5 --------------------------------- ## linkedHashMap ## 1 3 2 5 4
由此可見,大致上如下
Hashtable.keySet() 降序
TreeMap.keySet() 升序
HashMap.keySet() 亂序
LinkedHashMap.keySet() 原序
除了TreeMap.keySet(), JavaDoc中對keySet()返回值的順序沒有明確說明,
實際應用中,如果對順序有明確要求,最好能明確的對其順序進行整理。