【问题标题】:Hashmap put(), is it always ordering?Hashmap put(),它总是排序吗?
【发布时间】:2016-03-16 04:24:18
【问题描述】:

当我们使用put()hashmap<Key, Value> 变量添加值时,它们总是排序吗?

因为当我尝试使用简单的代码时,他们正在订购。

例子:

Map<Integer, Integer> ctrArMap = new HashMap<Integer, Integer>();
    ctrArMap.put( 1, 11);
    ctrArMap.put( 2, 12);
    ctrArMap.put( 3, 13);
    ctrArMap.put( 4, 14);
    ctrArMap.put( 5, 15);
    System.out.println(ctrArMap);

但在我的情况下,他们没有订购。

【问题讨论】:

  • 是的,结果正常。我也纳闷。我可以说,HashMap没有继承顺序是不对的,应该说,HashMap可能会在结果中给出插入顺序,但并非总是如此。

标签: java variables hashmap


【解决方案1】:
  1. HashMap :- HashMap 永远不会保留您的广告订单。它在内部使用散列概念,通过它生成一个HashCode 到对应的key 并将其添加到HashMap

  2. LinkedHashMap :- LinkedHashMap 它会保留您的广告订单。和 keys 将与您插入此 LinkedHashMap 的顺序相同。

  3. TreeMap :- TreeMap 类通过使用 Tree 实现 Map 接口TreeMap 提供了一种按排序顺序存储 键/值 对的有效方法,并允许快速检索。

您应该注意,与HashMap 不同,树形图保证其元素将按键升序排序

【讨论】:

    【解决方案2】:

    HashMap 不保留插入顺序。但是,如果您按顺序使用值 0 到 10,这些值恰好在内部散列到存储桶 0 到 10 并按该顺序放置在数组中。当您迭代 HashMap 时,您正在按顺序查看这些存储桶。注意:此实现可能会在未来发生变化,并且可能不会发生。

    HashMap 的默认大小为 16,负载因子为 0.7,您可以添加 11 个值而无需调整大小。这意味着当您查看这些值时,当前的实现恰好按排序顺序放置 0 到 10。

    如果您只需要按顺序排列 0 到 10 的值,我建议使用数组,而不是 HashMap。

    【讨论】:

      【解决方案3】:

      HashMap 没有固有的顺序。如果您正在寻找广告订单,请使用LinkedHashMap。如果您正在寻找自然顺序(A-Z、0-9),请使用TreeMap

      【讨论】:

        【解决方案4】:

        使用 TreeMap 进行升序。

        语法:

        TreeMap<Integer, Integer> ctrArMap= new TreeMap<Integer, Integer>();
        
            ctrArMap.put( 1, 11);
            ctrArMap.put( 3, 12);
            ctrArMap.put( 2, 13);
            ctrArMap.put( 5, 14);
            ctrArMap.put( 4, 15);
            System.out.println(ctrArMap);
        

        【讨论】:

          【解决方案5】:

          简单的答案是否定的,哈希映射没有“顺序”。这一切都取决于对象的散列方式。对于一个数字,您可以看到一些排序,但这纯粹基于作为 put() 键的对象的 hashCode() 方法。

          如果您能掌握Integer 类或类似数字类的来源并查看hashCode() 方法,您可能会明白为什么HashMap 中的数字会按顺序返回。如果您切换到字符串键,您很可能会立即看到它不再排序。

          【讨论】:

          • 我不是 100% 正确,但我可以说“有时 HashMap 会按插入顺序给出结果”。与其说“Hashmap 没有顺序”,不如说“Hashmap 有时有顺序,但并不总是”。因为如果你运行上面的程序,它会给你的结果是有序的,所以我们无法避免这种情况.
          • 我相信如果将示例中的插入顺序颠倒,即 5 4 3 2 1,打印时仍然会看到升序。对于 HashMap,数据的顺序与键的哈希值严格相关。
          猜你喜欢
          • 2012-10-06
          • 2012-01-21
          • 2014-11-13
          • 2021-11-23
          • 2012-10-08
          • 1970-01-01
          • 1970-01-01
          • 2013-04-28
          • 1970-01-01
          相关资源
          最近更新 更多