java.util.HashSet源码分析
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
HashSet实现Set接口,内部维护一个HashMap实例变量。不保证顺序,允许null元素。
对于基本的操作,如add,remove,contains,size,只需要常量的时间复杂度。
不是线程安全的,如果在多线程环境下,需要被同步化,如调用方法Collections.synchronizedSet(new HashSet())。
HashSet的迭代器是快速失败的,如果一个HashSet在迭代器被创建后被改变(不是使用迭代器的remove方法),迭代器会抛出ConcurrentModificationException。
private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
两个实例变量,map是内部维护的HashMap,PRESENT是放到HashMap的value的变量。
5个构造器:
//空set, map对象的初始容量16,负载因子0.75
public HashSet() {
map = new HashMap<>();
} public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
} public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
} //初始化容量,使用默认负载因子0.75
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
} //使用LinkedHashMap,dummy参数的作用只是与使用HashMap实现的构造器有不一样的方法签名
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
//使用的是HashMap的键集合,返回的迭代器是键集合的迭代器
public Iterator<E> iterator() {
return map.keySet().iterator();
}
//放进map的键值对是,参数e和常量PRESENT,所有键值对的值都是同一个Object对象
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
如果元素e已经存在HashSet之中,不改变Set并返回false,如果e不在HashSet之中,返回true
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
如果o在HashSet中,返回值是true,否则为false
还有一些其他方法没列出来,如size,isEmpty。
HashSet有实现Clonable接口,所以有clone方法,实现Serializable接口,所以有writeObject,readObject序列化反序列化方法。
java.util.HashSet源码分析的更多相关文章
- java.util.Collection源码分析和深度讲解
写在开头 java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所 ...
- java.util.HashMap源码分析
在java jdk8中对HashMap的源码进行了优化,在jdk7中,HashMap处理“碰撞”的时候,都是采用链表来存储,当碰撞的结点很多时,查询时间是O(n). 在jdk8中,HashMap处理“ ...
- java.util.AbstractStringBuilder源码分析
AbstractStringBuilder是一个抽象类,是StringBuilder和StringBuffer的父类,分析它的源码对StringBuilder和StringBuffer代码的理解有很大 ...
- java.util.Hashtable源码分析
Hashtable实现一个键值映射的表.任何非null的object可以用作key和value. 为了能存取对象,放在表里的对象必须实现hashCode和equals方法. 一个Hashtable有两 ...
- java.util.Dictionary源码分析
Dictionary是一个抽象类,Hashtable是它的一个子类. 类的声明:/** The <code>Dictionary</code> class is the abs ...
- JAVA的HashSet源码分析
一.HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.HashS ...
- java.util.TreeSet源码分析
TreeSet是基于TreeMap实现的,元素的顺序取决于元素自身的自然顺序或者在构造时提供的比较器. 对于add,remove,contains操作,保证log(n)的时间复杂度. 因为Set接口的 ...
- java.util.TreeMap源码分析
TreeMap的实现基于红黑树,排列的顺序根据key的大小,或者在创建时提供的比较器,取决于使用哪个构造器. 对于,containsKey,get,put,remove操作,保证时间复杂度为log(n ...
- java.util.LinkedList源码分析
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, D ...
随机推荐
- 将PHP作为Shell脚本语言使用
我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...
- iOS开发——语法篇OC篇&静态方法与实例方法
静态方法与实例方法 方法是类的行为,写在接口和实现两个文件中.在接口部分声明方法,在实现部分实现方法. 1.类方法与实例方法 Objective-C中的类可以声明两种类型的方法:实例方法和类方法.实例 ...
- 琐碎-关于hadoop2.2.0
HDFS模块功能 namenode:主节点,存储文件的元数据如文件名.文件目录结构.文件属性(生成时间.副本数.文件权限).以及每个文件的块列表和块所在的datanode等: datanode:在本地 ...
- Android 高级UI设计笔记04:使用setDrawingCacheEnabled(boolean flag)提高绘图速度
1. View组件显示的内容可以通过cache机制保存为bitmap, 使用到的API有: void setDrawingCacheEnabled(boolean flag) Bitmap getDr ...
- python(1) - 字符串
前面说过了,字符串也是一种数据类型,但字符串有一个特殊的问题,就是编码. 因为计算机是美国人发明的,所以最早只有127个字符被编码到计算机里,就是大小写英文字母,数字和一些符号,这个编码表被称为ASC ...
- Linux命令行下cp,rm,mv命令的使用
以下的内容来源于<鸟哥的私房菜> Linux命令行下的复制.删除与移动:cp,rm,mv cp(copy)复制 cp这个命令的用途很多,除了单纯的复制之外,还可以创建链接文件 ...
- linux下 cmatrix的安装和使用
安装过程 wget http://www.asty.org/cmatrix/dist/cmatrix-1.2a.tar.gztar xvf cmatrix-1.2a.tar.gzcd cmatrix- ...
- javaweb学习总结十九(http协议概述以及http请求信息分析)
一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...
- 【策略】UVa 278 - Chess
Chess Almost everyone knows the problem of putting eight queens on an chessboard such that no Quee ...
- poj 3352 边连通分量
思路与poj3177一模一样. #include<iostream> #include<cstdio> #include<cstring> #include< ...