美文网首页
“==”,equal 和 hashcode

“==”,equal 和 hashcode

作者: 黑色偏幽默 | 来源:发表于2019-06-20 15:21 被阅读0次

== 简单而又实在

  • 在基本数据类型中比较的是两个数据的值。
  • 在对象中比较的是两个对象的地址。

equal 追求的是“逻辑相等”

对大部分的对象来说,使用父类的 Object.equal() 就已经足够使用了。而 Object.equal() 实现的功能就是比较两个对象的地址是不是相同的。

  • 例如我们比较两个 Thread 是不是同一个线程,只要比较他们的地址就可以达到我们的目的了。

但依旧有些类,要求的不是绝对的相同(指向同一个对象),而是需要的逻辑上的相同(感官上觉得这两个类值是相同)。

  • 例如我们常用的 String ,Integer,Data 等,则需要根据他们的特性,去复写一个去判断值是不是相等的 equal() 方法。

复写 equal() 的需要满足:

  • 自反性(reflexive)。对于任何非 null 的引用值 xx.equals(x) 必须返回 true
  • 对称性(symmetric)。对于任何非 null 的引用值 xy ,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 必须返回 true
  • 传递性(transitive)。对于任何非 null 的引用值 xyz 。如果 x.equals(y) 返 回 true ,并且 y.equals(z) 也返回 true ,那么 x.equals(z) 也必须返回 true
  • 一致性(consistent)。对于任何非 null 的引用值 xy ,只要 equals 的比较操作 在对象中所用的信息没有被修改,多次调用 x.equals(x) 就会一致地返回 true ,或者一致的返回 false
  • 非空性 (Non-nullity)。对于任何非 null 的引用值 xx.equals(null) 必须返回 false 。
  1. 什么情况会违法对称性呢?
    比如说我们在自己的 IgnoreCaseString 类中,复写 equal() 方法,使这个方法在与 String 比较时,忽略 String 的大小写。但在 "Abc".equal(ignoreCaseString1) 在反过来,结果就会出现不同。
public static class IgnoreCaseString {
        private String string;

        public IgnoreCaseString(String str){
            this.string = str;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof String) {
                return string.equalsIgnoreCase((String) obj);
            }
            return super.equals(obj);
        }

        @Override
        public String toString() {
            return string;
        }
    }

    public static void main(String[] args) {
        String str = "Abc";
        IgnoreCaseString str1 = new IgnoreCaseString("Abc");
        System.out.println(str1.equals(str));// true
        System.out.println(str.equals(str1));// false
    }
    
  1. 什么时候会违法传递性
    A,B,C 三个类。A 和 B 同时复写了 equal() 方法时,会出现这种可能。

复写 equal() 尽量不要去想兼容其他类型的比较。而时去判断是否和同一个类是否相同。通常建议这样去判断:
(1)用 == 去判断是否为同个对象
(2)用 instanceof 去判断是否属于同个类或同个接口类型,如 Set,List 这类
(3)检查关键数据是否相同,这点根据自身的需求来处理

equal 忘不了的 hashcode

对象相等equal()判断为相等)可以保证 hashcode 相等。但不能反着推,长点心吧,毕竟连 map 都有知道哈希碰撞,弄个链表红黑树又不是用来玩的。

复写 hashcode 方法时为了不相等的对象产生不相等的哈希值。
怎么样复写,🐦了。

相关文章

  • Hashmap

    object的hashcode和equal函数 hashcode()直接返回该变量的内存地址 equal()函数:...

  • “==”,equal 和 hashcode

    == 简单而又实在 在基本数据类型中比较的是两个数据的值。 在对象中比较的是两个对象的地址。 equal 追求的是...

  • java基础--集合和流

    1.Map()重写equal同时重写hashCode()方法 Object类中的equal()和==是相同的 S...

  • Java Hashing:从重写HashCode到可变对象

    这是一篇关于hashCode方法,可变对象和内存泄漏问题的文章。 1. 重写 hashCode() 和 equal...

  • 2020-08-29

    java基础 一、java 中==和 equals 和 hashCode 的区别 1、对象类型不同 1、equal...

  • equals方法和hashCode方法

    简介 默认情况下,对象的equal()和hashcode()方法是调用Object类的equals方法和hashc...

  • Java Basis

    一、Java Object类方法:1,构造函数2,hashCode和equals函数用来判断对象是否相同equal...

  • Object类

    1、Object类中常用的方法,并简单介绍 toString()、clone()、hashCode()、equal...

  • Kevin Learn Kotlin:数据类、单例类、枚举类

    数据类 数据类通常需要重写 equals()、hashCode()、toString() 这几个方法: equal...

  • Java中hashCode的实现

    Java中hashCode的实现 从我们刚学Java就知道,要重写equal就要一起重写hashCode.但是你有...

网友评论

      本文标题:“==”,equal 和 hashcode

      本文链接:https://www.haomeiwen.com/subject/snqjqctx.html