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)
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)
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改变之后可能会找不到值。