源码分析五(HashSet的内部实现)
一:首先来看看Hashset的继承体系
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
继承AbstractSet类,实现Set接口
set接口继承Collection接口,所以可以迭代,集合的方法它都有,下面来看一下set接口:
public interface Set<E> extends Collection<E> {
// 集合中元素数量
int size();
// 判断集合是否为空
boolean isEmpty();
//判断是否包含指定元素
boolean contains(Object o);
//调用该方法可以产生迭代器,这个方法继承自Iterable接口
Iterator<E> iterator();
//将集合转换为数组,这个方法时集合和数组之间的桥梁
Object[] toArray();
//将集合转换为指定类型的数组
<T> T[] toArray(T[] a);
//向集合中添加元素
boolean add(E e);
//删除集合中的指定元素
boolean remove(Object o);
//判断是否包含指定集合中的所有元素
boolean containsAll(Collection<?> c);
//将指定集合中的元素添加到集合中
boolean addAll(Collection<? extends E> c);
//保留指定集合中的所有元素,就是集合中其他的元素删除
boolean retainAll(Collection<?> c);
//删除指定集合中的所有元素
boolean removeAll(Collection<?> c);
//清空集合中所有元素
void clear();
}
集合HashSet元素不可以重复,而且是有序的,因为它的底层维护了HashMap类的key值
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<E,Object>();
}
当使用构造器new一个HashSet的对象时,实际上创建了一个HashMap对象。
二:再来看看HashSet类中的方法:
//迭代HashSet中的元素,实际上是迭代HashMap的key值
public Iterator<E> iterator() {
return map.keySet().iterator();
}
//HashSet集合中元素size就是map集合中元素数量
public int size() {
return map.size();
}
//判断是否为空,也是判断map是否为空
public boolean isEmpty() {
return map.isEmpty();
}
//判断Hashset集合是否包含指定元素就是判断map中是否包含指定的key值
public boolean contains(Object o) {
return map.containsKey(o);
}
//向集合中添加元素就是向map中put元素,key就是元素,value是一个常量值
public boolean add(E e) {
return map.put(e, PRESENT)==null;
} private static final Object PRESENT = new Object();
//移除指定元素,就是删除map中的key-value映射
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
//清空HashSet集合中元素就是清空map集合
public void clear() {
map.clear();
}
三:总结
其实HashSet类的用法很简单,底层实现就是维护一个Hashmap,Hashset类的元素维护在Hashmap的key位置上,
value是一个常量值,因为Hashmap的key是不可重复的,有序的,所以Hashset也具有这样的特性,在涉及到排序
或者去重等问题时,可以考虑使用Hashset集合。
源码分析五(HashSet的内部实现)的更多相关文章
- JDK源码分析(五)——HashSet
目录 HashSet概述 内部字段及构造方法 存储元素 删除元素 包含元素 总结 HashSet概述 从前面开始,已经分析过集合中的List和Map,今天来介绍另一种集合元素:Set.这是JDK对 ...
- 集合源码分析之 HashSet
一 知识准备 HashSet 是Set接口的实现类,Set存在的最大意义区别于List就是,Set中存放的元素不能够重复,就是不能够有两个相同的元素存放在Set中,那么怎样的两个元素才算是相同的,这里 ...
- Vue系列---理解Vue.nextTick使用及源码分析(五)
_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...
- Android源码分析—深入认识AsyncTask内部机制
本文转载http://blog.csdn.net/singwhatiwanna/article/details/17596225该博主博文,谢谢该博主提供的好文章! 前言 什么是AsyncTask,相 ...
- Flask源码分析二:路由内部实现原理
前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了 ...
- jQuery 源码分析(五) map函数 $.map和$.fn.map函数 详解
$.map() 函数用于使用指定函数处理数组中的每个元素(或对象的每个属性),并将处理结果封装为新的数组返回,该函数有三个参数,如下: elems Array/Object类型 指定的需要处理的数组或 ...
- ABP源码分析五:ABP初始化全过程
ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下. 为个更清楚的描述其脉络,做了张流程图以辅助说明.其中每一步都涉及很多细节,难以在一张图中全部表现出来.每一步的细节(会涉及到较多接口,类 ...
- MPTCP 源码分析(五) 接收端窗口值
简述: 在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理. 接收端窗口值的初始化 ...
- vuex 源码分析(五) action 详解
action类似于mutation,不同的是Action提交的是mutation,而不是直接变更状态,而且action里可以包含任意异步操作,每个mutation的参数1是一个对象,可以包含如下六个属 ...
随机推荐
- (转载)WPF中的动画——(一)基本概念
http://www.cnblogs.com/TianFang/p/4050845.html WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面.首先,我们来复习一下动画的基本概念.计 ...
- 用apt爽还是apt-get爽
debian系linux发行版的高级软件包管理工具叫apt(for Advanced Package Tool) . debian的包管理体系很立体,dpkg -> apt ->aptit ...
- 俞军的PM12条
俞军的PM12条:1.PM首先是用户2.站在用户角度看待问题3.用户体验是一个完整的过程4.追求效果,不做没用的东西5.发现需求,而不是创造需求6.决定不做什么,往往比决定做什么更重要7.用户是很难 ...
- 【LINUX】——FreeBSD中的一些常规配置
一:在为终端的目录添加颜色: 在 ~/.cshrc 文件中添加以下两行: setenv CLICOLOR 1 setenv LSCOLORS Gxfxaxdxcxegedabagacad CLICOL ...
- linq操作符:聚合操作符
一.Aggregate操作符 Aggregate操作符对集合值执行自定义聚合运算.来看看Aggregate的定义: public static TSource Aggregate<TSource ...
- js json处理 双引号
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象 JSON字符串: var str1 = '{ "name": "cxh", ...
- 使用 Gearman 实现分布式处理
因为近来在研究 Mogilefs 的分布文件系统,在读读这个的源码,另外,为公司新设计了一个下载的系统,所以更加要深入研究一下,因为这个好东西是 Perl 写的,真不容易,在读这个的时间发现了几个好东 ...
- 关于Unity中Vector2和Vector3的使用
Vector2是用来定义和描述2D游戏内部的一些参数,像刚体的速度等等 Vector3是 1.鼠标点击屏幕后要转化为3D坐标的时候用到的定义和描述 2.两个物体之间的相对距离,或者说偏移量的变量类型
- pandas 的数据结构(Series, DataFrame)
Pandas 讲解 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标 ...
- 解救小哈——DFS算法举例
一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二. ...