Java Set排序

时间:2012-09-13 07:33:40

标签: java collections hashmap set

我们都知道Set(除了他们的这种实现)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是无序的,那么为什么这些记录按顺序打印。如果有人可以通过一些很好的例子给我理由。

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

因为String哈希码

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)与字母的顺序相同。 因此很可能会按此顺序退回。

答案 3 :(得分: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内部调整大小的时间有关。

尝试使用<{3}}的构造函数来复制内部大小调整,使用 initialCapacity loadFactor 。我想你可以看到差异。哦,当我执行你的代码时,我的订单与你在问题中发布的内容完全不同。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你很困惑“不保证”,“保证不会”。

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

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