• equals(), "== ",hashcode() 详细解释


    Object 通用方法容易混淆的定义

    先搞清楚各自的定义

    • "==" 用来判断 相等
    • equals() 用来判断 等价
    • hashcode() 用来返回散列值

    “==”相等

    • 基本类型,判断两个值是否相等
    • 引用类型,判断两个变量是否引用同一个对象

    在Object中未被重写的定义

    • hashcode()是为默认对象的内存地址

    • equals() 比较对象的地址

    是本地方法 c,c+语言直接返回对象的内存地址

    equals() 等价

    引用类型中判断引用的对象是否等价

    public class equalExample{
            private int x;
            private int y;
            private int z;
    
            public equalExample(int x, int y, int z){
                    this.x=x;
                    this.y=y;
                    this.z=z;
            }
    
             @override
             public boolean equals(Object o){
                    if(this.o==o)   return true;   // 引用同一个对象
                    if(o==null | getClass()!=o.getClass())  return false;  // 检测是否同一个类型
                    // object 对象转型
                    equalExample that=(equalExample)o;
                    if(x!=that.x)  return false;
                    if(x!=that.y)  return false;
                    return z==that.z;
             }
    }
    

    hashCode()返回散列值,而equals()用来判断两个对象是否等价

    等价的两个对象散列值一定相同,相同的两个对象不一定等价

    在覆盖equals()方法时应该总是覆盖hashCode()方法,保证等价的两个对象散列值也相等

    // 实现equals重写,没有实现 hashcode重写
    equalsExample e1=new equalsExample(1,1,1);
    equalsExample e1=new equalsExample(1,1,1);
    
    System.out.println(e1.equals(e2));   // true
    
    HashSet<equalsExample> set=new HashSet<>();
    set.add(e1);
    set.add(e2);
    System.out.println(set.size());          // 2
    
  • 相关阅读:
    细菌(disease)
    素数路(prime)
    母亲的牛奶(milk)
    Counting Islands II
    Popular Products
    Binary Watch
    BZOJ 1822[JSOI2010]Frozen Nova 冷冻波
    尝试一下LLJ大佬的理论AC大法
    BZOJ 3626 [LNOI2014]LCA
    BZOJ 3319 黑白树
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/11823769.html
Copyright © 2020-2023  润新知