2016-07-26 65 views
1
public class TestClass {  

    public static void main(String[] args) 
    { 
     HashMap<String,Integer> testMap = new HashMap<String,Integer>(); 
     testMap.put("Key1", 1); 
     testMap.put("Key2", 2); 
     testMap.put("Key3", 3); 
     testMap.put("Key4", 4); 
     testMap.put("Key5", 5); 
     //[Key2, Key1, Key4, Key3, Key5] //java7 
     //[Key2, Key1, Key5, Key4, Key3] //java8 
     System.out.println(testMap.keySet().toString()); 
    } 

} 

为什么键的顺序有所不同?HashMap.KeySet()在Java 7中以不同顺序返回键Java 8

+9

其实,集合中的元素的顺序(如keySet)是未定义的,可以是任何东西。如果您需要特定订单,请在使用SortedMap或排序键之前使用它们。 Java版本的更改可能会导致使用不同大小的数组来保存HashMap中的值(只是猜测)。 –

+1

集合无序 – Dariusz

+0

您运行程序和获取键集的次数大多数时间都不同。所以在java 7或java 8密钥集代码中没有区别。 – Imran

回答

3

为什么在按键的顺序不同?

因为:

  1. 了Java规范(即的Javadoc)没有指定一个HashMap的键集的顺序,

  2. 有到HashMap中的Java间实施了重大变化7和Java 8.

这些实现更改(显着提高了性能)导致键集更改的顺序。

但是,这并不被认为是一个“突破”的变化,因为键集的顺序一直清楚地注明为未指定 ....意思是你不应该依赖它。

+0

重大变化与...有关吗? –

+0

@AndrewsBAnthony数据存储方式不同,因此会有不同的迭代。您必须阅读并比较来源才能找到可能影响订单的每项变更。 –

+0

与表现有关....就像我说的。实际上,其中一件事是超出一定长度的散列链可能会转换为二叉树。有关详细信息,请参阅Java 8源代码。 –

2

根据规格不保证订购。单独的虚拟机可以自由执行他们选择的任何内容。

+2

@JFMeier如果它很有价值,你最好把它变成一个答案。 –

+0

实际上,集合是用Java编写的,因此VM与收集元素顺序无关。 – ekaerovets

1

HashMap不能维持秩序,如果你想订购的插入,你可以使用LinkedHashMap的:)

0

基于哈希表的Map接口实现。该实现提供了所有可选的映射操作,并允许使用空值和空键。 (HashMap类大致等同于Hashtable,除了它是不同步的并且允许为空值。)这个类不能保证地图的顺序;特别是,它不能保证订单会随着时间的推移保持不变。