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());   //我觉得应该是3才对。
   }
}
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.   

    hashcode都一样,自然就在put时被直接覆盖了……
      

  2.   

    后面的把前面的覆盖了,因为这3个的key都是ToDos对象,由于map的key唯一性所以map里面只有一个值
      

  3.   

    看错了,你的map应该是2个值啊,因为前两个对象是一样的,t2把t1给覆盖了,所以你的map的size应该为2
      

  4.   

    楼主把hashCode()方法的值写死了,所有对象的hashCode都一样,HashMap之所以叫"Hash",肯定是靠hashCode存取对象的,楼主好好理解一下hashCode再说,建议看看Thinking in java上关于hashCode的论述,hashCode()方法不能乱覆盖的。
      

  5.   

    楼主的程序我跑了下
    结果是2
    不清楚楼主的1是怎么跑出来的public boolean equals(Object o){
          return ((ToDos)o).day == this.day;
       }
       public int hashCode(){
          return 9;
       }在一个类可能会放入hashmap等用hash的数据结构的时候
    一定要保证equals和hashcode返回相等
    楼主这样写有问题,可能会引起程序的不正常结果
    建议修改为string 的hashcode
    另外由于string都放在字符串常量池的缘故,
    这个equals方法中的==竟然在这个小程序里面正常工作了
    还是改为string 的equals比较合理一些
      

  6.   

    如果用new ToDos(new String("xxx"));就是size=3了。
    这一定不是您程序的意图,所以用equals代替==比较String。
      

  7.   

        @Override public V put(K key, V value) {
            if (key == null) {
                return putValueForNullKey(value);
            }        int hash = secondaryHash(key.hashCode());
            HashMapEntry<K, V>[] tab = table;
            int index = hash & (tab.length - 1);
            for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) {
                if (e.hash == hash && key.equals(e.key)) {
                    preModify(e);
                    V oldValue = e.value;
                    e.value = value;
                    return oldValue;
                }
            }        // No entry for (non-null) key is present; create one
            modCount++;
            if (size++ > threshold) {
                tab = doubleCapacity();
                index = hash & (tab.length - 1);
            }
            addNewEntry(key, value, hash, index);
            return null;
        }源码……
    人家要比较key和hash这两样东西的
      

  8.   

    结果应该为2,比较两个对象是否一样是通过equals方法和hashcode方法两个方法的
    返回值比较,完全一样则对象为同一个。
      

  9.   

    hashMap存的时候如果KEY相同会覆盖前面的   比较KEY是否相同就是根据对象的EQUEALS方法  你前两个对象都是MONDAY  hashMap中第2个覆盖了第1个  结果应该是2    改了其中一个monday结果就是3了
      

  10.   

    结果为2,
    如果去掉
    public int hashCode(){
          return 9;
       }结果就是3了。那就是说t1,t2完全相等,导致t2覆盖了t1.
      

  11.   

    HashTable, HashMap, HashSet等是根据hashcode来判断是否相同的。
    TreeSet等式根据equals()来判断的。
      

  12.   

     LZ的编译器 真厉害! 最后跑出来了一个 size=1  。jdk生气了 嘻嘻!
     把 equals   hashCode  任何一个方法去掉 都是 size=3
      

  13.   

    if (e.hash == hash && key.equals(e.key)) {
                    preModify(e);
                    V oldValue = e.value;
                    e.value = value;
                    return oldValue;
       }大家看好这段了  要两个条件同事满足 才会当成是一个新的 对象放进去 !
      

  14.   

    你的代码
     m.put(t1, "doLaundry");
          m.put(t2, "payBills");
          m.put(t3, "cleanAttic");你换成 m.put("doLaundry, "t1);
          m.put("payBills", t2);
          m.put("cleanAttic", t3);这样就是3了