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的迭代器返回的顺序列表.
这是有保证的。
尽管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)
如果这两个代码有两种不同的行为,呃......
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |