hashMap的hashCode() 和equal()的使用
- hashMap的hashCode() 和equa()的使用
- 在java的集合中,判断两个对象是否相等的规则是:
- ,判断两个对象的hashCode是否相等
- 如果不相等,认为两个对象也不相等,完毕
- 如果相等,转入2
- ,判断两个对象用equals运算是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,认为两个对象相等
- 复制代码
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import android.app.Activity;
- import android.os.Bundle;
- public class TestCollectionActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Set<Person> hashSet = new HashSet<Person>();
- hashSet.add(new Person("张先生", ));
- hashSet.add(new Person("张太太", ));
- hashSet.add(new Person("张先生", ));
- hashSet.add(new Person("网先生", ));
- hashSet.add(new Person("网先生", ));
- hashSet.add(new Person("张先生", ));
- /** 最后结果输出为:
- * 张先生 12121212
- 张太太 12121213
- 网先生 12121210
- 张先生 12121210
- 如果不添加hashCode()和equals(),所有person成员都将正常输出
- 添加hashCode和equals之后,若a.hashCode() = b.hashCode且equals返回为true,此时原先的成员将被替代,
- 导致了上面的结果输出
- */
- Iterator<Person> it = hashSet.iterator();
- while(it.hasNext()) {
- Person person = it.next();
- System.out.println(person.getName() + " " + person.getId_card());
- }
- }
- public class Person {
- private String name;
- private long id_card;
- public Person(String name, long id_card) {
- this.name = name;
- this.id_card = id_card;
- }
- public long getId_card(){
- return id_card;
- }
- public String getName() {
- return name;
- }
- public int hashCode() {
- int result = ;
- result = (int)(id_card ^(id_card>>));
- return result;
- // final int PRIME = 31;
- // int result = 1;
- // result = PRIME * result + (int)(id_card ^ (id_card >>32));//long型数据取(int)位
- // result = PRIME * result + ((name == null) ? 0 : name.hashCode());
- // return result;
- }
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- final Person other = (Person) obj;
- if (id_card != other.id_card)
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
- }
- }
- 复制代码
- hashCode()和equal()由输出情况可得知:添加hashCode()和equals()之后,若a.hashCode() = b.hashCode且equals返回为true,此时原先的成员将被替代,导致了上面的结果输出。
- hashCode用于快速判断两个对象是否相等,如果相等,则根据equal的返回值确定是否覆盖,equal()返回true则覆盖。
- 下面是补充:
- =====================================
- 、 为什么要重载equal方法?
- 答案:因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。
- 、 为什么重载hashCode方法?
- 答案:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCode和equal方法。
- 、 为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?
- 答案:、因为是按照hashCode来访问小内存块,所以hashCode必须相等。
- 、HashMap获取一个对象是比较key的hashCode相等和equal为true。
- 之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equal为false。
- 、 为什么需要hashCode?
- 、 通过hashCode可以很快的查到小内存块。
- 、 通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。
微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。
hashMap的hashCode() 和equal()的使用的更多相关文章
- java——HashCode和equal方法
equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...
- hashCode和equal
转自:https://www.cnblogs.com/dolphin0520/p/3681042.html hashCode方法在Object类中: public native int hashCod ...
- java hashcode()和equal()方法比较
通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很 ...
- HashCode和equal方法
equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...
- HashMap中hashCode()和equals()重要性
Java中HashMap根据hashCode()和equals()方法来获取键值对的索引,同时也通过这两个方法由key值获取value值.如果没有这两个方法,那么当有两个相同的 hash值时,可能会被 ...
- HashMap与HashCode有关,用Sort对象排序
遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值. 上面这个算法的关键语句: Set s=m.keySet(); I ...
- HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...
- 对hashmap与hashcode()、equals()的理解
1.equals方法没被重写的时候 比较的只是对象的地址 重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会 ...
- HashMap/HashSet,hashCode,哈希表
hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...
随机推荐
- HDU4460
#include <iostream> #include <queue> #include <vector> #include <cstring> #i ...
- centos7制作本地yum源
创建想要挂载的路径 mkdir /mnt/cdrom 挂载本地镜像到创建的目录 mount -t iso9660 /dev/cdrom /mnt/cdrom/ mount: /dev/sr0 is w ...
- $("").append无反应
网页中F12看控制台提示“ReferenceError: $ is not defined” 解决: script src路径出了问题,改为 <script type="text/ja ...
- Convert Spaces to Tabs
:set tabstop=2 " To match the sample file :set noexpandtab " Use tabs, not spaces :%retab! ...
- 安装virtualbox出现2503、2502的错误提示解决方法
安装virtualbox右键选择以管理员的身份打开即可
- EF学习笔记(九):异步处理和存储过程
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...
- MATLAB2016a安装破解教程
首先,下载软件:下面是某博主的分享,可以下载软件. 链接:https://pan.baidu.com/s/1i6BgD8p 密码:17gg 第一步:安装软件 1,下载文件,得到R2016 ...
- ARM指令学习
跳转指令 直接向程序计数器PC写入i跳转地址值,可以实现在4GB的地址空间中的任意跳转. ARM跳转指令可以完成向前或向后的32MB的地址空间的跳转. -B 跳转指令 -BL 带返回的跳转指令 -BL ...
- Azure Sphere–“Object reference not set to an instance of an object” 解决办法
在开发Azure Sphere应用时,如果出现项目无法编译,出现“Object reference not set to an instance of an object”时,必须从下面两个方面进行检 ...
- Senparc.Weixin SDK v5.0 升级公告
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...