zoukankan      html  css  js  c++  java
  • Java中equals方法和hashCode方法的关系

    equals()和hashCode()都是Object类中定义的方法,所有类都有这两个方法

    Object类中equals方法的代码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }

    当不对equals()重写时,默认是使用的是“==”进行对对象的地址进行比较,地址相同则返回true,如下

    MyObject a = new MyObject(123);

    MyObject b = new MyObject(123);
    a.equals(b);// a和b的内容是相同的,但是地址不同,所以equals返回值为false

    自定义的类实例进行内容比较时,需要重写equals()方法,而String等类已经重写了equals()方法。

    hashCode()方法作用是计算对象的哈希值。该方法一般使用场景是把对象保存在需要计算哈希值的类中(如HashMap,Hashtable,HashSet)。

    MyObject a = new MyObject(123);
    
    MyObject b = new MyObject(123); 
    
    a.equals(b);// 假设equals被重写为对123进行比较,返回true
    
    Map<MyObject> mp = new hashMap<>();
    
    mp.add(a);
    
    mp.add(b);

    System.out.println(a.hashCode(),b.hashCode());// hashCode()方法没被重写,这里a和b的哈希值不同

    两个对象equals比较返回true,仍然可以同时存在hashMap中。

    为了和equals方法保持一致--euqals返回true时,两个对象的hashcode方法返回值相同;两个对象的hashcode不同时,equals方法返回false。

    则需要对hashCode()方法进行重写。如:

    @override
    public int hashCode(){  
        int hash =  property1.hashCode();
        return property1 ^ property2;
    }
    作者:Hahallo
             
    本文版权归作者和博客园共有,未经作者同意不能转载,否则保留追究法律责任的权利。
  • 相关阅读:
    jdk和jre是什么?都有什么用?(转帖)
    滚动栏范围位置函数(SetScrollRange、SetScrollPos、GetScrollRange、GetScrollPos)
    C#异步调用
    编译hadoop2.2.0源码时报错
    项目中登陆页面的显示
    VB读写Excel
    C socket demo
    java设计模式----单例模式
    poj3358数论(欧拉定理)
    Java实现 蓝桥杯VIP 算法训练 排列问题
  • 原文地址:https://www.cnblogs.com/bigyang/p/15177712.html
Copyright © 2011-2022 走看看