key已经重载equal hash方法啦
package com.he;import java.util.HashMap;
import java.util.Map;/**
 * @author wubuqilai 兔子(一对算起)
 */
public class Rabbit {
/**
 * 兔子出生后的月份-生的兔子数目*3月
 */
private int mouth; public Rabbit(int mouth) {
super();
this.mouth = mouth;
} public void addMouth(int change) {
this.mouth += change;
} public int getMouth() {
return mouth;
} public Rabbit clone() {
return new Rabbit(mouth);
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + mouth;
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Rabbit other = (Rabbit) obj;
if (mouth != other.mouth)
return false;
return true;
} @Override
public String toString() {
return "Rabbit [mouth=" + mouth + "]";
} public static void main(String[] args) {
Map<Rabbit, Integer> map = new HashMap<Rabbit, Integer>();
map.put(new Rabbit(23), 12);
for (Rabbit rabbit : map.keySet()) {
rabbit.addMouth(12);
}
for (Rabbit rabbit : map.keySet()) {
System.err.println(map.get(rabbit).toString());
}
}}
Exception in thread "main" java.lang.NullPointerException
at com.he.Rabbit.main(Rabbit.java:66)

解决方案 »

  1.   

    HashMap存储数据的时候会对key进行hash计算,来确定数据的存储位置。addMouth方法会改变mouth的值,由于对key进行hash计算的时候会用到mouth属性,mouth改变后hashCode也随之改变(即该key指向的存储位置已经改变了)。所以会找不到值。建议使用不会改变的属性来计算hashCode
      

  2.   

        public V get(Object key) {
            if (key == null)
                return getForNullKey();
            int hash = hash(key.hashCode());
            for (Entry<K,V> e = table[indexFor(hash, table.length)];
                 e != null;
                 e = e.next) {
                Object k;
                if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                    return e.value;
            }
            return null;
        }
    这是HashMap中get方法的源码,取值的时候会对key的hashCode进行hash运算,所以你的hashCode改变之后可能会找不到值。
      

  3.   

    第一次就散列好了, 不会变了。  除非重新new  再put
      

  4.   

    你要是重载一下map的方法,应该是没有问题的