从LinkedHashMap的keySet()创建的ArrayList是否保留了插入顺序?

spi*_*man 5 java linkedhashmap

我得到类似的数据

{"ABC的员工1","ABCX"},{"ABC的员工2","ABCY"},{"ABC的员工3","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);
            }
}
Run Code Online (Sandbox Code Playgroud)

我必须按照从数据库(Cursor)检索它的顺序将密钥传递给客户端.

List<String> empList = new ArrayList<String>(Common.empMap.keySet());
Run Code Online (Sandbox Code Playgroud)

keySet() - 文档说"返回此映射中包含的键的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);   
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:[ABC的员工1,ABC的员工2,ABC的员工3]

但是我的问题是,如果这是保证输出或者我是随机获得的,它可能会有所不同(?),

更新:2015年9月30日

谢谢大家,你们每个人都提供了有效的积分.

总结所有答案,

保证订单得以维持.

根据Javadocs,

LinkedHashMap是Map接口的Hash表和链表实现,具有可预测的迭代顺序.此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表.此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)

即:RefCursor将按照条目放入地图的顺序进行迭代.

因此, Map将给出我将键插入到地图中的相同顺序,因为按 LinkedHashMap指定顺序迭代.

深入实施ArrayList我们可以看到,

LinkedHashMap实现了newKeyIterator()方法,该方法返回继承LinkedHashIterator的类的实例,负责"排序"

//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);
            }
}
Run Code Online (Sandbox Code Playgroud)

对于这样的:Map 构造函数的ArrayList(集合)记录,填补了该元件通过指定collection的迭代器返回的顺序列表.

fge*_*fge 4

有保证的。

尽管Set接口本身不保证任何顺序(嗯,LinkedHashSet确实如此),但实现本身保证插入顺序的事实Map几乎保证了您也将按此顺序获得键。返回的接口.keySet()恰好是 a Set,因为 a 中的键Map保证是唯一的。

如果不是,请考虑在这种情况下会发生什么:

// case 1
for (final Map.Entry<K, V> entry: map.entrySet()) {
    // entry.getKey(), entry.getValue()
}

// case 2
for (final K key: map.keySet()) {
    V value = map.get(key);
}
Run Code Online (Sandbox Code Playgroud)

如果这两个代码有两种不同的行为,呃......