HashMap中的哪个键排序?

时间:2014-01-12 16:33:14

标签: java collections map

我对HashMap出现的顺序感到惊讶。

我正在

Chandler
Joe
Ross
1

而我预计

Joe
Chandler
Ross
1

符合我添加数据的顺序。

你能解释这个问题吗?

java代码:

HashMap测试:

public class HashCodeTest { 
    static int count = 0; 

    public static void main(String[] args) { 

        Map employees = new HashMap(); 

        employees.put(new Employee("Joe"), new Integer("1")); 
        employees.put(new Employee("Chandler"), new Integer("2")); 
        employees.put(new Employee("Chandler"), new Integer("2")); 
        employees.put(new Employee("Ross"), new Integer("3")); 

        Iterator iterator = employees.keySet().iterator(); 

        while (iterator. hasNext()) { 
            System.out.println(iterator.next()); 
        } 

        System.out.println(count); 
    } 
} 

地图键的类:

import java.util.*; 

class Employee { 
    private String name; 

    public Employee(String name){ 
        this.name = name; 
    } 

    public String toString(){ 
        return name; 
    } 

    public boolean equals(Object obj){ 
        HashCodeTest.count++; 

        if (obj == null) { 
            return false; 
        } 
        if (obj.getClass() != getClass()){ 
            return false; 
        } 

        Employee emp = (Employee)obj; 
        if (this.name == emp.name){ 
            return true; 
        } 
        return false; 
    } 

    public int hashCode(){ 
        return name.hashCode(); 
    } 
} 

2 个答案:

答案 0 :(得分:4)

未定义普通HashMap的顺序:

  

此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

您可以使用LinkedHashMap来保证迭代顺序等于插入顺序:

  

Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。

     

...

     

此实现使其客户免于HashMap(和Hashtable)提供的未指定的,通常是混乱的排序,而不会导致与TreeMap相关的成本增加。

答案 1 :(得分:2)

未订购基本HashMap。但是,有TreeMaps按键排序,LinkedHashMap按插入顺序排序。