今天记录一下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 }

输出结果:

谢谢大家,今天就讲到这里了,如有错误望及时提出来哦

最新文章

  1. Eclipse 实用技巧
  2. Webform Application传值 ViewState
  3. javascript闭包理解
  4. 《理解 ES6》阅读整理:函数(Functions)(八)Tail Call Optimization
  5. Android定位&amp;地图&amp;导航——基于百度地图移动获取位置和自动定位
  6. ci文件缓存使用,可以用来实现多模板切换 改写URL辅助函数
  7. ResultSetMetaData和DatabaseMetaData实现数据库中属性,属性值,属性所赋值的获取等
  8. How to installation V145 Renault CAN Clip diagnostic software
  9. Java Script基础(八) Array数组对象
  10. checkbox批量选中,获取选中的项的值
  11. android apk 导出(签名) is not translated in xx 代码混淆 反编译
  12. Ring3下干净的强行删除文件
  13. 3天CSS总结
  14. Python 常用模块大全(整理)
  15. cookie小结
  16. [20190319]shared pool latch与library cache latch的简单探究.txt
  17. 27、 jq 拖拽
  18. 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(六)CM的安装
  19. [转].net reactor 学习系列(五)---源代码加密程序
  20. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON SetComprise1

热门文章

  1. 见微知著 带你透过内存看 Slice 和 Array的异同
  2. 题解 [AHOI2017/HNOI2017]大佬
  3. docker harbor安装
  4. C# 多线程刷新UI
  5. C++CLR类库封装Native类库并用C#调用 - 草稿
  6. 【java web】拦截器inteceptor
  7. spring的异常处理
  8. 十:JavaWeb中的监听器(一)
  9. 【Azure 应用服务】使用PowerShell脚本上传文件至App Service目录  
  10. opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)