Java连载88-HashSet集合与hashCode方法重写
一、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.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料
Java连载88-HashSet集合与hashCode方法重写的更多相关文章
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问
本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...
- HashSet集合的add()方法的源码
interface Collection { ... } interface Set extends Collection { ... } class HashSet implements Set { ...
- 【java基础】java中Object对象中的Hashcode方法的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- Collections -集合排序compareTo方法重写,shuffle,addall
package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...
- Java父类对象调用子类实体:方法重写与动态调用
众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中hashCode()方法以及HashMap()中hash()方法
Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...
随机推荐
- 优雅写Java之二(数组集合流)
一.数组 二.集合 三.流 学习整理中,本文待补充--
- 爬虫之协程,selenium
1.什么是代理?代理和爬虫之间的关联是什么? 2.在requests的get和post方法常用的参数有哪些?分别有什么作用?(四个参数) - url headers parmas/data proxi ...
- ios启动流程
1.创建UIApplication (1.打开网页,发短信,打电话 . 2.设置应用程序提醒数字 . 3.设置联网状态 . 4.设置状态栏) 2.创建AppDelegate代理对象,并且成为UIApp ...
- php--->查询超大文件(12G)
今天遇到一个要在一个12G日志中查询数据的需求,手中暂时没有查询这种超大文件的工具,于是自己写了一个程度来读这个超大文件 其整体思路就是一行一行地去读取超大文件中的数据,然后将拿出的一行数据做相应的查 ...
- Jenkins环境配置(集成自动化程序)
一.下载 直接到官网https://jenkins.io/download/ 进行下载 二.安装 1.在浏览器地址栏输入:http://loclhost:8081 运行Jenkins,首次进入会提示 ...
- Dockers 部署 MongoDB + mongo-express
1. 拉取 Mongo 镜像 docker pull mongo: 2. 运行镜像 docker run -d --name mongodb --volume /usr/local/mongodat ...
- Docker(一):理解Docker镜像与容器
一.镜像的概念 1.广泛镜像概念: 镜像是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在完全相同的副本即为镜像. 2.Docker镜像概念: 在Docker中镜像同样是一种完全 ...
- json通过后台获取数据库中的内容,并在前端进行显示
fastjson.jar以及Echarts树图的js文件(需要在servlet对json进行赋值,所以需要用到json的插件) 链接:https://pan.baidu.com/s/1GBbamPNG ...
- RPC简单设计方案
服务端: 启动后,等待客户端发来信息,收到信息后进行处理,返回结果. 客户端: 主线程中发起一次RPC,那么就将信息封装成一个任务,提交到线程池,阻塞等待结果. 线程池中工作线程执行任务,发送信息,等 ...
- 安卓开发实战-记账本APP(六)
记账本APP开发---终结篇 昨天的动态数字录屏奉上:在抖音上拍了一个(ps:欢迎点赞) https://v.douyin.com/poEjmG/ 今天将图表的内容进行了制作,我用的是MPChart的 ...