我得到的數據是這樣從LinkedHashMap的keySet()創建的ArrayList是否保留了插入的順序?
{ 「員工ABC 1」, 「ABCX」},{ 「僱員2 ABC的」, 「ABCY」}, { 「員工3 ABC的」,「ABCZ 「}
從數據庫中通過RefCursor
。
我有一種情況,我需要保持從數據庫中讀取數據的順序。 由於我的數據是'鍵值',我想使用Map
這是有序的實現。因此選擇LinkedHashMap
//defined as a static map inside a common utlity class
public class Common{
public static final LinkedHashMap<String, String> empMap = new LinkedHashMap<String, String>();
}
//rs is the resultset
if (rs != null) {
while (rs.next()) {
key = rs.getString("name_text");
value = rs.getString("id");
Common.empMap.put(key, value);
}
}
我不得不鑰匙傳遞給客戶端,在其中它被從數據庫中(光標)中檢索到的相同的順序。
鍵設置() - 該文件說,「返回包含在此映射中鍵 的Set視圖set受映射支持,所以改變 地圖,反映在集,反之亦然」
我想到的是,由於ArrayList
也是一個有序集合,我應該得到的鑰匙在其被檢索/插入Map
以同樣的方式。
當我做一個樣本測試程序時,我得到了預期的結果。
public class LinkedMap {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("Employee 1 of ABC", "ABCX");
map.put("Employee 2 of ABC", "ABCY");
map.put("Employee 3 of ABC", "ABCZ");
ArrayList<String> list = new ArrayList<String>(map.keySet());
System.out.println(list);
}
}
輸出:[ABC的僱員1,ABC的僱員2,ABC的僱員3]
但是我問題是,如果這是保證輸出或者是它,我我想起來了隨機,它可能會發生變化,
更新(?):2015年9月30日
謝謝大家,你們每個人都貢獻了有效的積分。
總之所有的答案,
這是保證秩序得以維持。
按Javadocs,
LinkedHashMap的是哈希表和地圖 接口的鏈接列表實現,具有可預知的迭代順序。該實現 與HashMap的不同之處在於它通過其所有條目維護運行 的雙向鏈表。此鏈接列表定義迭代 排序,這通常是在其中鍵分別插入 地圖(插入順序)的順序
即:LinkedHashMap
將在其中條目放入的順序遍歷地圖。
所以LinkedHashMap#keySet()
會給我相同的順序,其中的鍵被插入地圖,因爲 LinkedHashMap#keySet().iterator()
按指定的順序迭代。
深要去的iterator()
實現中,我們可以看到,
LinkedHashMap的實現方法newKeyIterator()返回一個類繼承LinkedHashIterator的一個實例,同時將「排序」
// These Overrides alter the behavior of superclass view iterator() methods
Iterator<K> newKeyIterator() { return new KeyIterator(); } ...
private class KeyIterator extends LinkedHashIterator<K> {...
private abstract class LinkedHashIterator<T> implements Iterator<T> { ...
的護理
對於這一點:ArrayList<String> list = new ArrayList<String>(map.keySet());
構造的ArrayList(集合)是documented填補該eleme順序列表nts由指定的Collection的迭代器返回。
我喜歡變量類型是最具體的'LinkedHashMap',而不是模糊的'Map' :) – ZhongYu
我認爲,具有接口或具體類的引用對我的用例沒有什麼不同。但我必須承認,使用具體的類而不是接口是錯誤的。或者你感覺不一樣? – spiderman
不,我認爲最好爲本地/實例變量使用最具體的類型。 – ZhongYu