1

我们都知道迭代排序的集合(除了他们的这种实现)doesn't guarantee。所以我试图用下面的示例代码来确保这一点。

public static void main(String[] args) throws InterruptedException {
    Map<String,String> lMap=new HashMap<String, String>();
    lMap.put("A", "A");
    lMap.put("B", "B");
    lMap.put("C", "C");
    lMap.put("D", "D");
    lMap.put("E", "E");
    lMap.put("F", "F");
    lMap.put("G", "G");
    lMap.put("H", "H");
    lMap.put("I", "I");
    lMap.put("J", "J");
    lMap.put("K", "K");
    lMap.put("L", "L");
    for(int i=0;i<10000;i++){

        Thread.sleep(100);
        Set<Entry<String, String>> entrYset=lMap.entrySet();
        for(Map.Entry<String, String> e:entrYset){
            System.out.println(e.getKey()+" , "+e.getValue());
        }
                  System.out.println("******************************************************");
    }
}

上面的代码我执行了很多次,发现是按顺序打印记录。

我的问题是如果 java 声称HashMap是无序的,那么为什么这些记录是按顺序打印的。如果有人可以举例说明,那就太好了。

4

6 回答 6

5

每次的顺序都是相同的,因为字符串的哈希码不会改变,并且您以相同的顺序插入。Hashmap 是确定性的,因此如果您创建相同的 hashmap 并以相同的顺序插入内容,您将始终获得一致的顺序。

Hashmap 不保证此排序将保持一致。如果您插入更多项目,则排序可能会随着哈希表的重建而完全改变。

于 2012-09-13T07:40:09.157 回答
2

当您向地图添加新元素时,通常会发生重新排序。如果地图被调整大小,顺序可能会改变。

于 2012-09-13T07:38:57.513 回答
1

这是因为字符串哈希码

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}

对于一个字母字符串,它将是 h = 31*0+字符的数值,因此所有哈希码都是 1) 低 2) 与字母的顺序相同。因此,它们很可能会按此顺序退回。

于 2012-09-13T07:41:04.783 回答
0

你不正确。如果您查看Javadoc,它会说

This class makes no guarantees as to the order of the map; 
In particular, it does not guarantee that the order will remain constant over time

请注意,该文档说在 HashMap 中不能保证关于维护插入顺序的具体保证在大多数情况下,这与内部调整 HashMap 的大小有关。

尝试通过使用HashMap(int initialCapacity, float loadFactor)的构造函数来复制内部调整大小来使用initialCapacityloadFactor 。我想你可以看出区别。哦,当我执行您的代码时,我的顺序与您作为问题的一部分发布的顺序完全不同。

于 2012-09-13T07:40:34.363 回答
0

哈希表使用哈希函数将值放入集合中。因此它的顺序可能会根据哈希值而改变。因此,您将相同的值添加到具有相同哈希函数的哈希表中。这就是为什么你会在你的集合中看到一个订单。尝试更改值或插入值的顺序。它可能会改变结果的顺序。

于 2012-09-13T07:42:50.810 回答
0

您将“不保证”与“保证不会”混淆。

当然 HashMap 可以有一些内部排序。

文档声称的唯一一件事是您不应该依赖 HashMap 中的项目顺序,如果您这样做(基于与您类似的实验结果) - 好吧,您已被警告。

于 2012-09-13T07:50:47.370 回答