2011-04-06 83 views
4

在我的項目中,我使用了一些屬性文件。我注意到了Properties.propertyNames()的奇怪行爲,它返回一個Enumeration,Enumeration的順序相反。我做了一個試驗: 文件內容是:Properties.propertyNames()以相反的順序返回Enumeration - 爲什麼?

TT.1=Development 
TT.2=Application Setup/Release 
TT.3=Project Management 
TT.4=Meetings and Discussions 

的代碼是:

Enumeration<?> enumeration = properties.propertyNames(); 
    while (enumeration.hasMoreElements()) { 
     String key = (String) enumeration.nextElement(); 
     String value = properties.getProperty(key); 
     System.out.println(key + " " + value);       
    } 

輸出是:

TT.4 Application Setup/Release 
TT.3 Development 
TT.2 Meetings and Discussions 
TT.1 Project Management 

誰能告訴背後是什麼原因?謝謝。
編輯: 由於HashTable的鍵的形式是TT.X,其中X是一個數字,我對它進行了排序以使其順序正確。這是下一個實施:

this.taskTypeList = new ArrayList<String>(0); 
    Map<String, String> reverseTaskMap = new HashMap<String, String>(0);   
    Properties properties = loadTaskProperty(); 
    Enumeration<?> enumeration = properties.propertyNames(); 
    while (enumeration.hasMoreElements()) { 
     String key = (String) enumeration.nextElement(); 
     String value = properties.getProperty(key); 
     reverseTaskMap.put(key, value);    
    } 

    LinkedList<Map.Entry<String, String>> linkedList = new LinkedList<Map.Entry<String, String>>(reverseTaskMap.entrySet()); 
    Collections.sort(linkedList, new Comparator<Map.Entry<String, String>>() { 
     public int compare(Entry<String, String> object1, Entry<String, String> object2) {        
      return Integer.valueOf(Integer.parseInt(object1.getKey().split("\\.")[1])).compareTo(Integer.valueOf(Integer.parseInt(object2.getKey().split("\\.")[1]))); 
     } 
    }); 

    for (Iterator<Map.Entry<String, String>> iterator = linkedList.iterator(); iterator.hasNext();) { 
     Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next(); 
     taskTypeList.add(entry.getValue()); 
    } 

回答

9

這是巧合。 Properties不保證元素的任何特定順序,所以順序可以是任意的。

更具體地講,下面的實施細則導致此行爲:

  • 因爲你的鑰匙在最後一個字母區別僅在於,他們的哈希碼(由String.hashCode()生產)的區別僅在最後幾位。

  • PropertiesHashtable的子類。與HashMap不同,HashTable不應用補充散列函數來混合散列碼的位。由於Hashtable使用散列碼的最後一位作爲散列元素的數量來放置元素,因此將元素放入隨後的存儲區中。 這是一個非常有趣的觀點 - 這意味着Hashtable的這種實現可能會在一些真實世界的場景中顯示最糟糕的情況,而對於HashMap則不太可能。贊成HashMap優於Hashtable的另一個理由。

  • 出於某種原因HashtableEnumeration以相反的順序遍歷桶,因此添加的元素按相反的順序返回。

+1

謝謝你的精彩解釋。我非常感謝你的幫助。 – 2011-04-06 10:54:04

5

這只是一個巧合;這些屬性實際上是以未定義的順序返回的。 「屬性」只是一個Hashtable;散列表枚舉不會以任何特定順序返回它們的鍵。

+0

地球上的誰低估了這兩個答案? – 2011-04-06 10:22:37

+1

+1你的答案不值得讚賞 – stacker 2011-04-06 10:26:11

5

行爲背後的原因是:

class Properties extends Hashtable<Object,Object> 

所以沒有秩序維護,只是已經提到一個巧合axtavt。

相關問題