JDK1.8 HashSet
原理:
HashSet实现了Set接口,但是内部实现却是基于HashMap的。它的原理就是添加到集合里的值或者对象都成为了HashMap的key. 而HashMap有了Key之外,值怎么办呢。HashSet默认提供了一个供所有key共享的一个Object对象PRESENT.什么意思呢?下面会分析到。
也正是HashSet是基于HashMap的,那么我们知道HashMap的key允不允许重复,是不允许的嘛,判断依据equals是否相等,而且hashCode是否一样。既然HashMap的key不允许相等,就决定了添加到HashSet的值是不能相等的。
HashSet重要的属性
private transient HashMap<E,Object> map;
// 提供了一个供所有key共享的一个Object对象
private static final Object PRESENT =new Object();
构造方法:
public HashSet() {
map = newHashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = newHashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, floatloadFactor) {
map = newHashMap<>(initialCapacity, loadFactor);
}
HashSet重要方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
我们每添加一个元素E到HashSet,其实就是在HashMap里面存了一个
<KEY=E,VALUE= PRESENT>
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public int size() {
return map.size();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
从上面的方法得知,其实就是对HashMap进行的一些操作而已。
HashSet和 HashMap有啥异同
- HashSet实现的是Set接口;HashMap实现的是Map接口
- HashSet只是存储单个元素;HashMap存储的是键值对
- HashSet的值允许为空,但只允许一个,添加再多的null对象,其实只不过覆盖了之前的那个对象而已;HashMap允许键值为空,但是键只允许一次
JDK1.8 HashSet相关推荐
- JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet
详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...
- 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...
- HashSet源码分析 jdk1.6
Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements ...
- HashSet及LinkedHashSet源码分析(基于JDK1.6)
Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...
- Java集合深入学习 - HashSet源码解析(基于jdk1.8)
HashSet...感觉就像是一个阉割版的HashMap.. /*** 定义HashSet类 继承 AbstractSet 实现Set,Cloneable,Serializable*/ public ...
- HashSet源码解析——基于JDK1.8
前言 HashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了.当然了解HashMap可以参考我的这篇文章 1 常量介绍 //使用Ha ...
- 一次 HashSet 所引起的并发问题
作者:crossoverJie,GitHub 热门开源作者 来自:https://crossoverjie.top 背景 上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件. 心中暗道 ...
- JDK1.5 新特性
Java 5.0发布了,许多人都将开始使用这个JDK版本的一些新增特性.从增强的for循环到诸如泛型(generic)之类更复杂的特性,都将很快出现在您所编写的代码中.我们刚刚完成了一个基于Java ...
- Day 6:Vector类和实现Hashset以及登录窗口的模拟
LinkedList作业:生成扑克牌并且洗牌? import java.util.*;class Poker{String color;String number;public Poker(Strin ...
最新文章
- python3 配置文件操作库 configparser 读取配置文件后 元组列表转字典
- android缓存之Lrucache 和LinkedHashMap
- leetcode 764. Largest Plus Sign | 764. 最大加号标志(Java)
- ios 高德获取定位_解决ios11不支持高德地图API定位功能的方法
- ZZULIOJ 计算两点间的距离(多实例测试)
- 书评专家_书评:“开放”探讨开放的广泛文化含义
- epplus word html,EPPlus简介
- 编辑距离(线性DP+暴力匹配)
- 小程序 java在线考试系统python自动阅卷系统php自动组卷系统
- python进销存课程_蜗牛笔记-文章-蜗牛进销存项目实战(一)
- 楚纳电动车禁入电梯管控系统-电梯阻车原理
- 对讲机扫盲的基本常识
- java获取某年度有多少周_java获取一年共有多少周
- oracle18c创建数据库,Oracle 18C 手工创建CDB
- 三国群英传M玩亚服好还是台服好?服务器选择推荐
- 用开源的协同办公OA项目,做一个考勤系统
- 阿里云服务器是干什么用的?
- win10+cuda10.0+pytorch安装
- 从零开始在云服务器上搭建个人博客
- C语言中的void*是什么?
热门文章
- 全能直播王pc版_企鹅游戏直播助手v2.28.330.8-企鹅游戏直播助手PC版下载
- Oscache 概述
- 2012年美国计算机研究生排名,2012年美国研究生留学 计算机专业院校排名TOP50
- PostgreSQL12主从流复制(一主两从)
- jl计算机二级c语言考什么,计算机等级考试二级C语言考前密卷(9)2
- android 让dialog保持在最前_Android 面试进阶指南 —— 唠唠任务栈,返回栈和启动模式...
- 上海计算机和金融专业,姚明:我将去上海交大读书 选择计算机金融专业
- oel6mysql_OEL6.5_X86平台部署Oracle 11gR2 RAC并配置ACFS
- python代码中添加环境变量
- java反射 获取变量值_Java反射:如何获取变量的名称?