2012-09-13 112 views
1

我们都知道Set(除了它们的这种实现)doesn't guarantee的迭代排序。所以我试图确保这与下面的示例代码。Java集订购

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是无序的,那么为什么这个记录打印的顺序。如果有人可以给我理由,例如,这将是伟大的。

+1

你为什么要印10000次?如果地图未被修改,订单将始终保持不变。 – gontard

回答

5

订单每次都是一样的,因为字符串的散列码不会改变,而且您按照相同的顺序插入。哈希映射是确定性的,所以如果你创建相同的哈希映射并以相同的顺序插入东西,你总会得到一致的顺序。

散列图并不保证此排序将保持一致。如果插入更多项目,排序可能会随着哈希表重建而完全更改。

+2

这意味着除非我不修改hashmap,否则oreder将保持不变? – amicngh

+1

是的,这是一个更好的方式! –

2

当您向地图添加新元素时,通常会进行重新排序。如果地图得到调整,订单可能会改变。

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打。我认为你可以看到差异。哦,当我执行你的代码时,我的排序与你发布的问题完全不同。

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)中相同的顺序的字母。因此它很可能会按照这个顺序返回。

0

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

0

你很混淆“不保证”与“保证不是”。

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

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