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;
   }
}

解决方案 »

  1.   

    t2 把t1覆盖了 t3没有覆盖
      

  2.   

       public boolean equals(Object o){
          return true;
       }你这样改就可以了,Map还是要调用equals的。
      

  3.   

    为什么取不到呢知道hash算法么他不是说hashcode一样了就覆盖,而是按照一个公式然后往后或者往前错位存储的,所以不可能覆盖,只要key不一样,就不会覆盖。
      

  4.   

    问题就是key一样了。取老值,还是用新值覆盖原值??
    因为说:
    if (e.hash == hash && key.equals(e.key)) {
                    preModify(e);
                    V oldValue = e.value;
                    e.value = value;
                    return oldValue;
       }
      

  5.   

    key一样了自然新值覆盖旧值
    问题是你现在key并不一样,只是hash一样
      

  6.   

    明明 "payBills"这个是新值,"doLaundry"这个才是旧值啊
      

  7.   

    你向map中put两个相同的值,当然是后面的值覆盖前面的值啊
      

  8.   

    hashcode不是key哥们,hashcode是作为判断在hashmap里面存放位置的一个量。
      

  9.   

    怎么就不清楚了呢?
    hashCode先一样。
    再equals 也一样,那么这个key就是一样的。
      

  10.   

    首先,你在equals中应该写((ToDos)o).day.equals(this.day)才对,你现在正确只是因为你在两个字符串是同一个对象      m.put(t1, "doLaundry");
          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"
      

  11.   

    你的代码是不是写错了啊????????????  你先 m.put(t1, "doLaundry"); 然后再  m.put(t2, "payBills");
    最后m.get(t2)   怎么就不会取出payBills ????  就算你那hashcode 和 equals  方法不去改变 那也取的出payBills 啊你的代码最后一行是不是要改成 m.get(t1) 才是你要问的啊?
      

  12.   

    如果你要问的是 m.get(t1) 为什么取出payBills 的话  
    那么 t1就是t2    m.get(t1)  就是  m.get(t2)  
    你问的  : key一样了  是否新值覆盖原值 ??     说的是没错的如果不是问这个  那我没法子解释了   真是11楼说的思路有点乱了