zoukankan      html  css  js  c++  java
  • 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可以相等也可以不等;
    

      

    以上纯属个人理解!

        

           

      

  • 相关阅读:
    golang不想http自动处理重定向的解决方案
    学习WebDav
    keepass+坚果云管理我的密码
    定制右键功能,看这一篇就够了
    翻转二叉树
    加密sqlite3数据库文件
    算出cron表达式接下来几次执行时间
    关于斐波那契数列的3种解法
    golang通过cgo调用lua
    学习go语言并完成第一个作品
  • 原文地址:https://www.cnblogs.com/whtblog/p/8820623.html
Copyright © 2011-2022 走看看