hashcode的问题

    今天在使用dorado的时候,遇到了个很奇怪的问题,报错nullpoint,查到是与hashcode有关。原来,在覆盖了类的hashCode()方法后,将此类的对象当作key放到一hashmap里面,但是当修改了关系到hashcode值,使用get(obj)取不到值,hashmap在put()方法调用时就将obj的hashcode保存了,若是变了当然取不到了。看如下类代码:
 public class Person {

	private String id;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public int hashCode() {
		return id == null ? super.hashCode() : id.hashCode();
	}
}

   生成两个对象,new Person(),这2个对象的hashcode是不同的。再看会报错的地方:
import java.util.HashMap;

public class Test {

	public static void main(String[] args) throws Exception{
		Person p1 = new Person();
		p1.setId("11");
		
		HashMap map = new HashMap();
		map.put(p1, "p1");
		
		p1.setId("112");
		System.out.println(map.get(p1)); // 显示为null
	}

}

   在覆盖了equals()方法后,一定要覆盖hashCode()方法,可是在使用会变得属性生成hashcode的话,改变了属性同时hashcode会变,问题就在这里。比如,几个未保存的javabean并没有设置id,(假设根据id生成hashcode),在保存之前给他生成id,但是hashmap会认为生成id前后的javabean是2个不同的object。
  说明:在hashmap、hashset等集合框架里面,判断2个object相等的方法是equals()和hashCode(),因此不能只重写equals。
解决方法:
   在放进hashmap之前,生成id。

你可能感兴趣的:(框架)