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