我对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();
}
}
答案 0 :(得分:4)
未定义普通HashMap
的顺序:
此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
您可以使用LinkedHashMap
来保证迭代顺序等于插入顺序:
Map
接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap
的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。...
此实现使其客户免于
HashMap
(和Hashtable
)提供的未指定的,通常是混乱的排序,而不会导致与TreeMap
相关的成本增加。
答案 1 :(得分:2)
未订购基本HashMap
。但是,有TreeMaps
按键排序,LinkedHashMap
按插入顺序排序。