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可以相等也可以不等;

  

 

 

以上纯属个人理解!

    

       

  

 

posted @ 2018-04-13 15:24  一碗雪花  阅读(191)  评论(0编辑  收藏  举报