hashset实现原理(对Java如何判断HashSet和HashMap中相同元素的研究)

:暂无数据 2026-08-18 00:30:07 :0

hashset实现原理(对Java如何判断HashSet和HashMap中相同元素的研究)

今天给各位分享对Java如何判断HashSet和HashMap中相同元素的研究的知识,其中也会对对Java如何判断HashSet和HashMap中相同元素的研究进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

对Java如何判断HashSet和HashMap中相同元素的研究

在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。 equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。 接下来有两个个关于这两个方法的重要规范(我只是抽取了最重要的两个,其实不止两个): 规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。 规范2:如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。 1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 2、如果两个对象不equals,他们的hashcode有可能相等。 3、如果两个对象hashcode相等,他们不一定equals。 测试程序如下:首先我们定义一个类,重写hashCode()和equals(Object obj)方法Java代码class�0�2A�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2@Override�0�2�0�2�0�2�0�2�0�2�0�2public�0�2boolean�0�2equals(Object�0�2obj)�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(“判断equals“);�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2return�0�2false;�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2@Override�0�2�0�2�0�2�0�2�0�2�0�2public�0�2int�0�2hashCode()�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(“判断hashcode“);�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2return�0�21;�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2}�0�2�0�2class A { @Override public boolean equals(Object obj) { System.out.println(“判断equals“); return false; } @Override public int hashCode() { System.out.println(“判断hashcode“); return 1; } } Java代码 public�0�2class�0�2Test�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2public�0�2static�0�2void�0�2main(String�0�2args)�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2Map《A,Object》�0�2map�0�2=�0�2new�0�2HashMap《A,�0�2Object》();�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2map.put(new�0�2A(),�0�2new�0�2Object());�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2map.put(new�0�2A(),�0�2new�0�2Object());�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(map.size());�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2public class Test { public static void main(String args) { Map《A,Object》 map = new HashMap《A, Object》(); map.put(new A(), new Object()); map.put(new A(), new Object()); System.out.println(map.size()); } } 运行之后打印结果是: 判断hashcode 判断hashcode判断equals2 可以看出,Java运行时环境会调用new A()这个对象的hashcode()方法。其中: 打印出的第一行“判断hashcode”是第一次map.put(new A(), new Object())所打印出的。 1、当第一次map.put(new A(), new Object())的时候,Java运行时环境就会判断这个map里面有没有和现在添加的 new A()对象相同的键,判断方法:调用new A()对象的hashcode()方法,判断map中当前是不是存在和new A()对象相同的HashCode。显然,这时候没有相同的,因为这个map中都还没有东西。所以这时候hashcode不相等,则没有必要再调用 equals(Object obj)方法了。参见推论4(如果两个对象hashcode不相等,他们一定不equals) 2、当第二次map.put(new A(), new Object())的时候,Java运行时环境再次判断,这时候发现了map中有两个相同的hashcode(因为我重写了A类的hashcode()方 法永远都返回1),所以有必要调用equals(Object obj)方法进行判断了。参见推论3(如果两个对象hashcode相等,他们不一定equals),然后发现两个对象不equals(因为我重写了equals(Object obj)方法,永远都返回false)。 3、这时候判断结束,判断结果:两次存入的对象不是相同的对象。所以最后打印map的长度的时候显示结果是:2。 改写程序如下:Java代码import�0�2java.util.HashMap;�0�2�0�2import�0�2java.util.Map;�0�2�0�2�0�2�0�2�0�2�0�2class�0�2A�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2@Override�0�2�0�2�0�2�0�2�0�2�0�2public�0�2boolean�0�2equals(Object�0�2obj)�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(“判断equals“);�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2return�0�2true;�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2@Override�0�2�0�2�0�2�0�2�0�2�0�2public�0�2int�0�2hashCode()�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(“判断hashcode“);�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2return�0�21;�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2}�0�2�0�2�0�2�0�2�0�2�0�2public�0�2class�0�2Test�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2public�0�2static�0�2void�0�2main(String�0�2args)�0�2{�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2Map《A,Object》�0�2map�0�2=�0�2new�0�2HashMap《A,�0�2Object》();�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2map.put(new�0�2A(),�0�2new�0�2Object());�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2map.put(new�0�2A(),�0�2new�0�2Object());�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2System.out.println(map.size());�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2}�0�2�0�2import java.util.HashMap; import java.util.Map; class A { @Override public boolean equals(Object obj) { System.out.println(“判断equals“); return true; } @Override public int hashCode() { System.out.println(“判断hashcode“); return 1; } } public class Test { public static void main(String args) { Map《A,Object》 map = new HashMap《A, Object》(); map.put(new A(), new Object()); map.put(new A(), new Object()); System.out.println(map.size()); } } 运行之后打印结果是: 判断hashcode 判断hashcode判断equals1显然这时候map的长度已经变成1了,因为Java运行时环境认为存入了两个相同的对象。原因可根据上述分析方式进行分析。 以上分析的是HashMap,其实HashSet的底层本身就是通过HashMap来实现的,所以他的判断原理和HashMap是一样的,也是先判断hashcode再判断equals。 所以:写程序的时候应尽可能的按规范来,不然在不知不觉中就埋下了bug!

Java中的HashMap的工作原理是什么

一,存储方式: Java中的HashMap是以键值对(key-value)的形式存储元素的。
二,调用原理: HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
三,其他热性: HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

OK,关于hashset实现原理和对Java如何判断HashSet和HashMap中相同元素的研究的内容到此结束了,希望对大家有所帮助。

hashset实现原理(对Java如何判断HashSet和HashMap中相同元素的研究)

本文编辑:admin

更多文章:


dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)

dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)

本篇文章给大家谈谈dropdownlist 绑定,以及DropDownList 绑定所有项 并 显示指定项对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月11日 08:50

协方差计算公式(协方差的计算公式)

协方差计算公式(协方差的计算公式)

这篇文章给大家聊聊关于协方差计算公式,以及协方差的计算公式对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月11日 08:10

易语言网页api接口怎么调用(易语言,怎么读取网页json的api)

易语言网页api接口怎么调用(易语言,怎么读取网页json的api)

本篇文章给大家谈谈易语言网页api接口怎么调用,以及易语言,怎么读取网页json的api对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月11日 08:00

majority of(the majority of 和 a majority of的区别以及用法例句)

majority of(the majority of 和 a majority of的区别以及用法例句)

这篇文章给大家聊聊关于majority of,以及the majority of 和 a majority of的区别以及用法例句对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月11日 07:40

汉字机内码查询表(1个汉字的机内码是几位谢谢)

汉字机内码查询表(1个汉字的机内码是几位谢谢)

大家好,关于汉字机内码查询表很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于1个汉字的机内码是几位谢谢的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月11日 07:20

promote翻译(英语翻译倡导怎么说)

promote翻译(英语翻译倡导怎么说)

其实promote翻译的问题并不复杂,但是又很多的朋友都不太了解英语翻译倡导怎么说,因此呢,今天小编就来为大家分享promote翻译的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 06:30

用手机如何导航?开车用手机导航哪个软件最好

用手机如何导航?开车用手机导航哪个软件最好

今天给各位分享用手机如何导航的知识,其中也会对用手机如何导航进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月11日 06:20

多线程技术有什么用(多线程有什么作用)

多线程技术有什么用(多线程有什么作用)

其实多线程技术有什么用的问题并不复杂,但是又很多的朋友都不太了解多线程有什么作用,因此呢,今天小编就来为大家分享多线程技术有什么用的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 05:40

another time(another time和other time的区别)

another time(another time和other time的区别)

大家好,another time相信很多的网友都不是很明白,包括another time和other time的区别也是一样,不过没有关系,接下来就来为大家分享关于another time和another time和other time的区

2026年10月11日 05:00

java开发工具包jdk(JDK是什么意思)

java开发工具包jdk(JDK是什么意思)

其实java开发工具包jdk的问题并不复杂,但是又很多的朋友都不太了解JDK是什么意思,因此呢,今天小编就来为大家分享java开发工具包jdk的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 04:50

最近更新

repercussions(都是余波,repercussions和aftermath有什么区别啊)
2026-10-11 09:00:05 浏览:0
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026-10-11 08:50:04 浏览:0
majority of(the majority of 和 a majority of的区别以及用法例句)
2026-10-11 07:40:02 浏览:0
热门文章

标签列表