Java 为什么data.entrySet().iterator()的顺序与HashMap不同<;长字符串>;数据?
我有输入数据(时间戳、Json字符串),存储在Java 为什么data.entrySet().iterator()的顺序与HashMap不同<;长字符串>;数据?,java,json,iterator,hashmap,Java,Json,Iterator,Hashmap,我有输入数据(时间戳、Json字符串),存储在HashMap中。为了处理JSON字符串,我使用了迭代器 我使用Iterator it=data.entrySet().Iterator()以获取作为迭代器的入口集 现在我的问题是HashMap的组织方式如下: 123,{String1} 124,{String2} 125,{String3} 更好地表达:我将A添加到HashMap,Z添加到HashMap,E添加到HashMap,I添加到HashMap。我希望A,Z,E,I和我在迭代器中
HashMap
中。为了处理JSON字符串,我使用了迭代器
我使用Iterator it=data.entrySet().Iterator()
以获取作为迭代器的入口集
现在我的问题是HashMap的组织方式如下:
123,{String1}
124,{String2}
125,{String3}
更好地表达:我将A添加到HashMap,Z添加到HashMap,E添加到HashMap,I添加到HashMap。我希望A,Z,E,I和我在迭代器中的顺序相同
如果我把它放在迭代器中,我会得到:
124, {String2}
123, {String1}
125, {String3}
Iterator的顺序与HashMap顺序不同。对我来说,迭代器的顺序必须与HashMap的顺序完全相同。我做错了什么,迭代器正在更改数据的顺序?
HashMap
没有按任何特定顺序组织,或者更准确地说,顺序没有保证。如果您想要一个有序映射,请使用SortedMap
和TreeMap
实现,如果您需要覆盖键的默认顺序,则提供一个比较器
。HashMap
没有按任何特定顺序组织,或者更准确地说,顺序没有保证。如果您想要一个有序映射,如果您需要覆盖键的默认顺序,请使用SortedMap
和TreeMap
实现,提供一个比较器
。文档说明
此类不保证地图的顺序;在里面
特别是,它不能保证订单保持不变
随着时间的推移
因此,在迭代视图entrySet
或keySet
或值时,不应依赖顺序
一些Map
的实现,如TreeMap
提供了订购保证,正如@Oleg S和@Smutje已经建议的那样。文档说明
此类不保证地图的顺序;在里面
特别是,它不能保证订单保持不变
随着时间的推移
因此,在迭代视图entrySet
或keySet
或值时,不应依赖顺序
一些Map
的实现,如TreeMap
提供订购保证,正如@Oleg S和@Smutje已经建议的那样。摘自java.util.Map
API文档:“映射界面提供三个集合视图,允许将映射的内容视为一组键、值集合或一组键值映射。映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他的,比如HashMap类,则没有。”摘自java.util.Map
API文档:“Map接口提供三个集合视图,允许将映射的内容视为一组键、值集合或一组键值映射。映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他的,如HashMap类,则没有。”除了上述发现,
即使您可以使用下面给出的LinkedHashMap,LinkedHashMap也会确保按插入顺序存储值
public static void main(String[] args) {
Map<Integer, String> map = new LinkedHashMap<Integer, String>();
Map<Integer, String> map2 = new HashMap<Integer, String>();
map.put(1, "oneone");
map.put(3, "twoone");
map.put(2, "threeone");
map2.put(1, "oneone");
map2.put(3, "twoone");
map2.put(2, "threeone");
for(Entry<Integer, String> entry:map.entrySet()){
System.out.println(entry.getKey());
}
for(Entry<Integer, String> entry:map2.entrySet()){
System.out.println(entry.getKey());
}
}
publicstaticvoidmain(字符串[]args){
Map Map=newlinkedhashmap();
Map map2=新的HashMap();
地图放置(1,“一个”);
地图放置(3,“两个一”);
地图放置(2,“三个一”);
map2.put(1,“一个”);
map2.put(3,“两个一”);
map2.put(2,“三个一”);
for(条目:map.entrySet()){
System.out.println(entry.getKey());
}
for(条目:map2.entrySet()){
System.out.println(entry.getKey());
}
}
这里的结果是,
1
3
2
1
2
3
除了上述发现,
即使您可以使用下面给出的LinkedHashMap,LinkedHashMap也会确保按插入顺序存储值
public static void main(String[] args) {
Map<Integer, String> map = new LinkedHashMap<Integer, String>();
Map<Integer, String> map2 = new HashMap<Integer, String>();
map.put(1, "oneone");
map.put(3, "twoone");
map.put(2, "threeone");
map2.put(1, "oneone");
map2.put(3, "twoone");
map2.put(2, "threeone");
for(Entry<Integer, String> entry:map.entrySet()){
System.out.println(entry.getKey());
}
for(Entry<Integer, String> entry:map2.entrySet()){
System.out.println(entry.getKey());
}
}
publicstaticvoidmain(字符串[]args){
Map Map=newlinkedhashmap();
Map map2=新的HashMap();
地图放置(1,“一个”);
地图放置(3,“两个一”);
地图放置(2,“三个一”);
map2.put(1,“一个”);
map2.put(3,“两个一”);
map2.put(2,“三个一”);
for(条目:map.entrySet()){
System.out.println(entry.getKey());
}
for(条目:map2.entrySet()){
System.out.println(entry.getKey());
}
}
这里的结果是,
1
3
2
1
2
3
从其他答案复制?@OlegS。你不能认为这是因为我复制了什么。stackoverflow的所有用户都会多次编辑答案,以使答案更完整。你和我碰巧有相同的答案并不意味着我复制了。我想这是在同时编写。;-@OlegS。总之,我还添加了e在我的帖子中提到了这两个答案,这只是为了说明我是多么不愿意抄袭。你不应该对相同的答案如此挑剔。你会发现一些问题,每个人都有相同的答案。他们都相互抄袭??不,这不是一个社区的工作方式。每个人都有平等的机会表达他们的答案。B由于相对较新,你很快就会发现。在其他两个帖子发布后,你编辑了你的答案,首先添加了关于TreeMap的信息,然后添加了关于SortedMap的信息,因此这与大致同时提出一个原始想法无关。从其他答案复制?@OlegS。你不能认为这是因为我复制了或其他什么。stackoverflow的所有用户都会对答案进行多次编辑,以使答案更完整。您和我碰巧有相同的答案