博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈重不重写equals和hashcode对于HashMap添加元素的影响
阅读量:3943 次
发布时间:2019-05-24

本文共 2076 字,大约阅读时间需要 6 分钟。

文章目录

只针对键是自定义类型的情况

1.不重写hashcode与equals方法

public class Dog {
private String name; private Integer old; public Dog(String name, Integer old) {
this.name = name; this.old = old; } @Override public String toString() {
return "Dog{" + "name='" + name + '\'' + ", old=" + old + '}'; } public static void main(String[] args) {
Dog dog1 = new Dog("haha", 2); Dog dog2 = new Dog("haha2", 22); Dog dog3 = new Dog("haha2", 22); Map
dogStringHashMap = new HashMap<>(); dogStringHashMap.put(dog1, "1"); dogStringHashMap.put(dog2, "2"); dogStringHashMap.put(dog3, "3"); for(Map.Entry
entry:dogStringHashMap.entrySet()){
System.out.println(entry.getKey().toString()+entry.getValue().toString()); } System.out.println("---------------"); System.out.println(dogStringHashMap.get(new Dog("haha2", 22))); }}

在这里插入图片描述

如果没有重写这两个函数,那么相同的键是可以加入的,hashmap本质上是通过内存地址进行区分是否相同,所以最后get出名字为haha2年龄为22的狗时为null,因为这是个new出来的新对象,即使值一样,但是它有新的内存地址

2.重写 equals 不重写hashcode

情况与1一样

因为加入hashmap的时候,hashmap会先对key做hash,如果key的hash值已经存在于hashmap里,则再对有相同hash值的key进行equals比对,看看值是否相等,没有重写的hashcode,native函数一般是通过将该对象的内部地址转换成一个整数,所以不同的内存地址一般会生成不同的值

3.不重写 equals 重写hashcode

情况与1一样

不重写equals方法,native的equals方法是比较的内存地址,与==是一样的,就算重写了hashcode,hashcode相等的时候也会进行equals对比,结果肯定是不等的

4.重写 equals 重写hashcode

@Override    public boolean equals(Object obj) {
if(this.name.equals(name)){
return true; } return false; } @Override public int hashCode() {
return name.hashCode(); }

这里我是用名字来作为标识

在这里插入图片描述
所以dog3就把dog2覆盖掉了,因为他们的名字是一样的
最后取出name为haha2,年龄为22的value的时候也是根据名字取出了dog3的value,为3

所以重写 hashcode 方法是为了让我们能够正常使用 HashMap 等集合类,因为 HashMap 判断对象是否相等既要比较 hashcode 又要使用 equals 比较。先用hashcode过滤一遍是为了提高 HashMap 的效率.

当我们重写一个类的 equals 方法时就应当连同重写 hashcode 方法,并且两个方法应满足:

1)一致性,即:当两个对象 equals 比较为 true,那么 hashcode 值应当相等,当两个对象hashcode 值相等,但是 equals不一定相等

2)成对重写,即重写 equals 就应当重写 hashcode。

转载地址:http://duowi.baihongyu.com/

你可能感兴趣的文章
android 在手机中预置联系人/Service Number
查看>>
android 系统语言为英语时,Contacts联系人名字含有特殊前缀后缀(Dr. Mr. Lt等)时的相关问题处理
查看>>
android 短信下,添加联系人,进入联系人多选界面出现联系人电话号码晃动的问题
查看>>
android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
查看>>
正确学习javascript。困惑的指南
查看>>
SERO幻影社区的背景怎么样?几大主流隐私币种技术分析!
查看>>
SERO目前具备的十大技术特点
查看>>
Neo4j CQL语句学习Day3
查看>>
Neo4j CQL学习Day4
查看>>
Mysql 数据库
查看>>
MySQL数据库练习
查看>>
Neo4j学习Day5
查看>>
Tomcat的基本配置
查看>>
Neo4j学习Day6~7
查看>>
Servlet学习笔记
查看>>
JSP相关介绍
查看>>
Session和Cookie
查看>>
数据库系统原理与设计复习笔记
查看>>
MVC设计模式
查看>>
GIT简要介绍
查看>>