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
posted @ 2019-11-08 22:54  dengshuo7412  阅读(157)  评论(0编辑  收藏  举报