【问题标题】:Does HashTable maintains the insertion order?HashTable 是否维护插入顺序?
【发布时间】:2011-09-18 08:10:47
【问题描述】:

以下代码以相同的插入顺序为我提供输出。我阅读了 javadoc,他们甚至没有谈论插入顺序。谁能帮我获取正确的信息。

import java.util.*;

public class hash {

public static void main(String[] args) {

    String str[] = { "japan",
            "usa",
            "japan",
            "russia",
            "usa",
            "japan",
            "japan",
            "australia"};
    int len = 8;
    Hashtable ht = new Hashtable();
    int i = 0;
    while (i < len) {

        String c = str[i];
        System.out.println("c :" + c);
        Integer intg = (Integer) ht.get(c);

        if (intg == null)
            ht.put(c, new Integer(1));
        else
            ht.put(c, new Integer(intg.intValue() + 1));

        i++;
    }

    Enumeration k = ht.keys();

    while (k.hasMoreElements()) {
        String key = (String) k.nextElement();
        System.out.println(key + " > " + ht.get(key));
    }
}
}

【问题讨论】:

    标签: java collections dictionary hashtable


    【解决方案1】:

    不,它没有。要保留插入顺序,请改用java.util.LinkedHashMap (javadoc)。

    另外,HashMap 现在比Hashtable 更受欢迎,因为Hashtable 有不必要的并发开销。 (见Differences between HashMap and Hashtable?。)

    【讨论】:

      【解决方案2】:

      不,它没有。它只知道“哈希”顺序。如果你重新排序字符串,你会发现它们仍然以相同的顺序出现在哈希表中。

      【讨论】:

      • “如果你对字符串重新排序,你会发现它们仍然以与哈希表相同的顺序出现” - 并非总是如此。如果存在冲突,则哈希表顺序将取决于键插入顺序。因此,尝试重新排序可能会更改哈希表的顺序,尽管不是您想要的方式。
      • 正确。我只是想说,对这些特定字符串进行简单的重新排序会产生相同的输出。
      【解决方案3】:

      Hashtable 用于快速查找而不是维护顺序。您应该查看LinkedHashMap 或其他数据结构。

      【讨论】:

      • LinkedHasMap 是一个非常好的实现,当我们还希望在 hashmap 中进行排序时。我试图寻找一个好的设计或相同的伪代码,但找不到任何东西。如果您知道任何链接,请分享。
      【解决方案4】:

      LinkedHashMap 用于维护插入元素的顺序。Hashtable 类似于 HashMap,但它不允许空键或空值,而 HashMap 允许一个空键和多个空值...

      【讨论】:

        【解决方案5】:

        来自地图 Javadoc。

        地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,如 TreeMap 类,对它们的顺序做出特定的保证;其他的,比如 HashMap 类,不这样做。

        查看Hashtable和HashMap的代码也很有用。

        【讨论】:

          猜你喜欢
          • 2016-02-27
          • 2016-08-29
          • 2011-10-25
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-31
          • 2011-02-27
          相关资源
          最近更新 更多