一个非常好的问题,关系到map的put和get方法,put会调用equals判断对象是否存在,这和你说的这个没关系,你的问题主要关乎get方法,get会调用hashcode方法,根据得到的值去查找对象。所以,当你hashcode方法返回return this.name.length();时,你把magoli改为cagnolia,两者长度不一样,所以找不到了,如果改为cagnol,即长度一致就可以找到了,return 4道理相同

解决方案 »

  1.   

    你用的是HashMap,这个map在存储数据的时候是根据key的hashCode来决定存储在哪个数组里。如果key的hashCode变化了的话就会导致HashMap在根据key的hashCode查找数组时找到的不是正确的数组,所以也就不能定位value了。
    而你的Dog类的hashCode是根据name.length来的,那么当你的name长度变化后,就不能在HashMap中找到对应的value了。
      

  2.   

    涉及到hashCode()方法.最好设置为如果有可能相等则hashcode相同不变的.
      

  3.   

    同学,你用的是hashmap实现类   其实 hashmap底层就是用的哈希表作为数据结构的而 <Key> 的hashcode 是用来在哈希表中寻址的  因为哈希表必然会存在哈希冲突的问题,所以在哈希冲突的时候使用<Key>的equals方法来判断是否是相同的<Key>  而你的例子里equals 重写的有问题  不妨把equals 内改成 returned this.name.equals(arg0.toString());试试
      

  4.   

    查看hashmap的实现源码
    答案就在那里