import java.util.HashMap;
import java.util.Map;public class MapEQ {
public static void main(String[] args) {
Map<ToDos, String> m = new HashMap<ToDos, String>();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(m.size());
System.out.println(m.get(t2)); //怎么payBills还会被读取到呢??
}
}
class ToDos{
String day;
ToDos(String d){
day = d;
}
public boolean equals(Object o){
return ((ToDos)o).day == this.day;
}
public int hashCode(){
return 9;
}
}
import java.util.Map;public class MapEQ {
public static void main(String[] args) {
Map<ToDos, String> m = new HashMap<ToDos, String>();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(m.size());
System.out.println(m.get(t2)); //怎么payBills还会被读取到呢??
}
}
class ToDos{
String day;
ToDos(String d){
day = d;
}
public boolean equals(Object o){
return ((ToDos)o).day == this.day;
}
public int hashCode(){
return 9;
}
}
return true;
}你这样改就可以了,Map还是要调用equals的。
因为说:
if (e.hash == hash && key.equals(e.key)) {
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}
问题是你现在key并不一样,只是hash一样
hashCode先一样。
再equals 也一样,那么这个key就是一样的。
m.put(t2, "payBills"); //这一行会由于t2与t1的hashCode相同,而且t2.equals(t1)是true,所以会map中的t1原来对应的值被修改为"payBills" m.put(t3, "cleanAttic");//由于t3与t2虽然hashCode相同,但是t3.equals(t2)是false,所以map不会覆盖原来的值,是新建了一个Entry System.out.println(m.size());
System.out.println(m.get(t2)); //怎么payBills还会被读取到呢??
//所以get(t2)时,读取的就是
"payBills"
最后m.get(t2) 怎么就不会取出payBills ???? 就算你那hashcode 和 equals 方法不去改变 那也取的出payBills 啊你的代码最后一行是不是要改成 m.get(t1) 才是你要问的啊?
那么 t1就是t2 m.get(t1) 就是 m.get(t2)
你问的 : key一样了 是否新值覆盖原值 ?? 说的是没错的如果不是问这个 那我没法子解释了 真是11楼说的思路有点乱了