Java连载88-HashSet集合与hashCode方法重写
2020-02-25 16:03:15来源:博客园 阅读 ()
一、Set集合
1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构。
2.哈希表又称为散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相等的,hash值实际上是key调用hashCode方法,再通过"hash function"转化成的值。
3.如何向哈希表中添加元素
先调用被存储的key的hashCode方法,经过某个算法得出的hash值,如果在这个哈希表中不存在这个hash值,则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果equals方法返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素。
4.HashSet其实是HashMap中的key部分,HashSet有什么特点,HashMap中的key应该具有相同的特点。
5.HashMap和HashSet初始化容量都是16,默认加载因子0.75
package com.bjpowernode.java_learning; ? import java.util.HashSet; import java.util.Set; import java.util.Iterator; ? public class D88_2_ { public static void main(String[] args) { Set s = new HashSet(); s.add(1); s.add(1); s.add(100); Iterator i = s.iterator(); while(i.hasNext()) { System.out.println(i.next()); } } }
二、重写hashCode和equals方法(?有一个原则:散列均匀分布)
package com.bjpowernode.java_learning; import java.util.*; ? public class D88_2_HasCodeAndEqualsMethod { public static void main(String[] args) { //创建集合 Set s = new HashSet(); Employee88 e1 = new Employee88("1000","Jack"); Employee88 e2 = new Employee88("1001","Jack"); Employee88 e3 = new Employee88("1001","Scott"); Employee88 e4 = new Employee88("1000","Jack"); Employee88 e5 = new Employee88("3000","JIN"); Employee88 e6 = new Employee88("3001","Cook"); //添加元素 s.add(e1); s.add(e2); s.add(e3); s.add(e4); s.add(e5); s.add(e6); System.out.println(s.size()); } } //根据现实的业务逻辑可以得知,该公司的员工编号是:1000-9999 class Employee88{ //编号 String no; //姓名 String name; //Constructor Employee88(String no,String name){ this.no = no; this.name = name; } //我们下面重写了hashCode方法的目的就是: //能够对同工号同名字的员工判断为同一个元素 //如果不重写hashCode方法,那么会对对象的内存地址进行hashCode计算,这样就不会有相同的元素了 //重写hashCode方法之后,相同的hashCode值,就会接下来的判断 //也就是重写equals方法 //如果员工编号相同,并且名字相同,则是同一个对象 public boolean equals(Object o) { if(this==o) { return true; } if(o instanceof Employee88) { Employee88 e = (Employee88)o; if(e.no.equals(this.no) && e.name.equals(this.name)) { return true; } } return false; } //重写hashCode方法 public int hashCode() { //以员工编号分组 return no.hashCode(); } } ?
?解释:六个对象里面有一个完全相同,因此会输出五个元素?;如果不重写的话,就会输出六个元素?。
总结?:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode和equals方法?
三、源码:
D88_1_HashSetExample.java
D88_2_HasCodeAndEqualsMethod.java
https://github.com/ruigege66/Java/blob/master/D88_1_HashSetExample.java
https://github.com/ruigege66/Java/blob/master/D88_2_HasCodeAndEqualsMethod.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料
原文链接:https://www.cnblogs.com/ruigege0000/p/12359680.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:jvm 内存结构
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash