【问题标题】:How to avoid items being re-ordered when put into java HashMap放入java HashMap时如何避免重新排序项目
【发布时间】:2011-09-06 19:07:48
【问题描述】:

我正在创建一个新地图并将字符串推入其中(没什么大不了的)-但我注意到随着地图的增长,字符串正在重新排序。是否可以停止这种重新排序,以便地图中的项目保留放置时的顺序?

Map<String,String> x = new HashMap<String, String>();
x.put("a","b");
x.put("a","c");
x.put("a","d");

x.put("1","2");
x.put("1","3");
x.put("1","4");

//this shows them out of order sadly...
for (Map.Entry<String, String> entry : x.entrySet()) {
    System.out.println("IN THIS ORDER ... " + entry.getValue());
}

【问题讨论】:

  • 如果没有排序,就不可能是hashmap,真的……
  • @tdammers - 嗯?你能解释一下吗?
  • 如果它排序它不是哈希映射会更准确。哈希映射放置条目是一种随机模式。 LinkedHashMap 通过记住您添加它们的顺序或它们最后使用的顺序来隐藏这一点。但是,它们仍将在其基础存储中以随机顺序放置。
  • 我的意思是 hashmap 存储算法通过它们的 hash 对条目进行排序以允许 O(log n) 哈希查找(或者更确切地说,排序是 hashmap 存储它的方式的副作用条目)。按哈希排序不是一种随机模式,尽管由于哈希值的任意性质,它可能看起来像一种随机模式。
  • @tdammers 可能是一个错字——哈希图平均争取 O(1) 查找; treemaps 争取 O(log n) 查找。

标签: java hashmap


【解决方案1】:

如果您关心订单,可以使用SortedMap。实现接口的实际类(至少在大多数情况下)是TreeMap。或者,LinkedHashMap 也保持其顺序,同时仍使用基于哈希表的容器。

【讨论】:

  • 请注意,在搜索类的 JavaDoc 时添加“7”通常会产生一个直接指向 最新 文档的链接。
【解决方案2】:

您可以使用LinkedHashMap 保留它。

【讨论】:

    【解决方案3】:

    Java 中的 HashMap 未排序 http://download.oracle.com/javase/1,5.0/docs/api/java/util/HashMap.html。如果您想要可预测的迭代顺序,请改用 LinkedHashMap:http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedHashMap.html

    这里有一个关于差异的很好的讨论:How is the implementation of LinkedHashMap different from HashMap?

    【讨论】:

    • 请注意,在搜索类的 JavaDoc 时添加“7”通常会产生一个直接指向 最新 文档的链接。
    【解决方案4】:

    前面的答案是正确的,因为您应该使用维护排序的 Map 实现。 LinkedHashMap 和 SortedMap 都做这些事情。

    但是,要点是并非所有集合都保持顺序,如果顺序对您很重要,您应该选择适当的实现。 Generic HashMaps 不维护顺序,不声称这样做,也不能设置为这样做。

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2020-03-02
      • 2021-03-11
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2011-11-20
      • 2020-06-30
      相关资源
      最近更新 更多