Java中hashCode、equals、==的区别
ref:http://www.cnblogs.com/skywang12345/p/3324958.html
1、==作用:
java中的==用来判断两个对象的地址是否相等;当对象是基本数据类型时,可以用来判断值是否相等?这句话有毛病!!!(直接用数值时?)
http://www.cnblogs.com/whtblog/p/9029208.html中的part2.2,中的例子两个String也不能用"=="来判断值相等。
2、equals():
Object类中定义的equals()方法, return (this == obj); 通过==来判断,很多JAVA类重写了equals方法,java对equals方法的重写要求需满足以下条件:
1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。 2. 反射性:x.equals(x)必须返回是"true"。 3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。 4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。 5. 非空性,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。
如下:
@Override public boolean equals(Object obj){ if(obj == null){ return false; } //如果是同一个对象返回true,反之返回false if(this == obj){ return true; } //判断是否类型相同 ,返回对象的运行时类。 if(this.getClass() != obj.getClass()){ return false; } Person person = (Person)obj; return name.equals(person.name) && age==person.age; //调用了String类的equals方法 }
3、hashCode():
1、在用到散列表时,hashCode()方法才需要重写并发挥作用!
hashCode():获取哈希码,返回一个int类型的整数。当需要将该类放入散列表(如HashMap)时,才需要用到hashCode方法判断存放地址,在该地址上已存在的对象中用equals去判断值是否相等。如果跳过hashCode判断,有可能出现如下情况:存入对象o1与存在对象o2值(属性值)相同,此时应该用o1替换掉o2,但是由于o1.hashCode()!=o2.hashCode(),(调用的是未重写的hahsCode方法),散列表在哈希码对应的地址处没有元素,则将o1放入该地址。这样造成了HashMap中存在两个相同的对象,违背了HashMap的设计原则。
2、在如HashMap,Hashtable,HashSet等散列表中,equals()方法的重写需要hashCode()方法的重写,遵循:
(1):若o1.equals(o2)==true,则必须有o1.hashCode()==o2.hashCode(),反之不成立; (2):若o1.equals(o2)!=true,则hashCode可以相等也可以不等;
以上纯属个人理解!