今天记录一下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 }
测试代码:
1 import java.util.HashSet; 2 import java.util.Iterator; 3 4 public class HashSetTest1 { 5 public static void main(String[] args) { 6 HashSetTest hashSetTest = new HashSetTest("张三",12); 7 HashSetTest hashSetTest1 = new HashSetTest("李四",34); 8 HashSetTest hashSetTest2 =new HashSetTest("张三",12);//定义一个前面出现过的对象,那么后面就不会加入到hashSet集合中 9 HashSet<HashSetTest> hashSet = new HashSet<>(); 10 //添加对象到hashSet集合中,此时就会调用hashCode和equals方法 11 hashSet.add(hashSetTest); 12 hashSet.add(hashSetTest1); 13 hashSet.add(hashSetTest2); 14 //遍历hashSet集合 15 Iterator iterator =hashSet.iterator(); 16 while (iterator.hasNext()){ 17 System.out.println(iterator.next()); 18 } 19 } 20 }
输出结果:
谢谢大家,今天就讲到这里了,如有错误望及时提出来哦