码迷,mamicode.com
首页 > 编程语言 > 详细

Java中hashCode¥equals¥==的区别

时间:2018-04-13 16:22:16      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:bsp   相同   ret   属性   wan   lan   通过   方法   java类   

ref:http://www.cnblogs.com/skywang12345/p/3324958.html

1、==作用:

  java中的==用来判断两个对象的地址是否相等;当对象是基本数据类型时,可以用来判断值是否相等;

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

  

 

 

以上纯属个人理解!

    

       

  

 

Java中hashCode¥equals¥==的区别

标签:bsp   相同   ret   属性   wan   lan   通过   方法   java类   

原文地址:https://www.cnblogs.com/whtblog/p/8820623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!