2014-01-12 2 views
0

Я удивлен приказанием моего HashMap.Какой ключевой заказ в 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

В HashMap нет заказов. _ «Этот класс не дает никаких гарантий относительно порядка карты, в частности, он не гарантирует, что порядок останется постоянным с течением времени». _ –

+0

В тесте я вижу разные варианты с разным порядком –

ответ

4

Упорядочение простой HashMap не определен:

Этот класс не дает никаких гарантий что касается порядка карты; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

Вы можете вместо этого использовать LinkedHashMap, гарантирующий порядок итерации, равный порядок вставки:

хэша-таблицу и связанный список реализацию интерфейса Map, с предсказуемым порядком итерации. Эта реализация отличается от HashMap тем, что она поддерживает список с двойной связью, проходящий через все его записи. Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (вставка-порядок).

...

Этой реализация запасной частей своих клиентов от неопределенного, как правило, хаотического порядка, обеспечиваемого HashMapHashtable), без какого-возросших расходов, связанных с TreeMap.

2

Базовый HashMap не заказан. Однако есть TreeMaps, которые упорядочены по ключу, и LinkedHashMap, которые упорядочены вставкой.

Смежные вопросы