hashCode 和 equals 的区别
今天记录一下hashCode的知识,以前都没有怎么接触过的,感觉还是很陌生,专门去学习了一下
首先我最大的问题就是hashCode究竟是干什么 的,现在也一知半解了吧,
哈希值是一个对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址。而hashCode()就是寻找哈希值的一个方法
那又要为什么要有这个hashCode() 呢?
为了减少equals()的使用次数,提高执行效率(说的比较不全面,但自己能理解就好,下面通过具体讲解就通了)
hashCode() 和 equals()方法的作用(分为两种情况)
1、如果类中不重写他们:
hashCode():返回对象的地址值
equals(): 比较两个值的地址
2、如果类中重写了:
hashCode(): 根据对象的成员变量,返回一个整数
equals():比较两个值是否相等
hashCode 和 equals 重写后比较两个对象是否相等
如果两个对象比较的equals()相等,那么这两个对象的hashCode()肯定相等,就是说equals()是绝对靠谱的
如果两个对象比较的hashCode()相等,那么equals()去做比较却不一定相等,就是说hashCode()不是绝对可靠的
通过hashCode()和 equals()搭配是如何提高效率的
对于一个对象中有大量的成员信息,只用equals()比较效率会比较低
可以先通过hashCode() 比较,如果不相等,则两个对象一定不同,如果相等,那就用equals()进行比较,这样hashCode()方法可以给我们比较出大部分对象的比较,从而提高效率
最后讲讲他们两个搭配的应用
HashSet集合都知道吧,它的特点就是无序,元素唯一,主要靠的就是重写hashCode()和equals()方法:
下面用代码演示:
1 //建立JavaBean 2 import java.util.Objects; 3 4 public class HashSetTest { 5 private String name; 6 private int age; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public int getAge() { 14 return age; 15 } 16 public void setAge(int age) { 17 this.age = age; 18 } 19 public HashSetTest(String name, int age) { 20 this.name = name; 21 this.age = age; 22 } 23 @Override 24 public String toString() { 25 return "HashSetTest{" + 26 "name="" + name + """ + 27 ", age=" + age + 28 "}"; 29 } 30 public HashSetTest() { 31 } 32 // 重写equals()和hashCode()方法 33 @Override 34 public boolean equals(Object o) { 35 if (this == o) return true; 36 if (o == null || getClass() != o.getClass()) return false; 37 HashSetTest that = (HashSetTest) o; 38 return age == that.age && 39 Objects.equals(name, that.name); 40 } 41 @Override 42 public int hashCode() { 43 return Objects.hash(name, age); 44 } 45 }