当前位置:网站首页>HashSet源码解析
HashSet源码解析
2022-07-30 22:48:00 【骆驼整理说】
目录
HashSet
HashSet都是基于HashMap来实现的。HashSet的特点如下:
- 内部使用HashMap的key存储元素,以此来保证元素不重复;
- HashSet 是无序的,因为 HashMap 的 key 是无序的;
- HashSet 中允许有一个 null 元素,因为 HashMap 允许 key 为 null;
- HashSet 是非线程安全的。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
// 基于HashMap实现
private transient HashMap<E,Object> map;
// 只需要用到HashMap中key唯一的特性,所以value全部使用同一个 Object实例填充,节省内存空间
private static final Object PRESENT = new Object();
/**
* 实例化 HashSet 的时候,初始化内部的 HashMap
*/
public HashSet() {
map = new HashMap<>();
}
/**
* 根据一个集合实例,实例化 HashSet
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
* 根据初始容量和扩容因子实例化 HashSet,减少rehash频率,提升性能,原理与HashMap相同
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
/**
* 同上
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
/**
* 返回迭代器,用于迭代
* 下面所有的功能都是基于 HashMap 来实现的
*/
public Iterator<E> iterator() {
return map.keySet().iterator();
}
/**
* 元素个数
*/
public int size() {
return map.size();
}
/**
* 是否为空
*/
public boolean isEmpty() {
return map.isEmpty();
}
/**
* 是否包含给定元素
*/
public boolean contains(Object o) {
return map.containsKey(o);
}
/**
* 添加元素,如果 Set集合中未包含该元素,返回true
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
/**
* 删除元素,如果Set集合包含该元素,返回true
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
/**
* 清除元素
*/
public void clear() {
map.clear();
}
/**
* 浅克隆
*/
@SuppressWarnings("unchecked")
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
}
TreeSet
边栏推荐
猜你喜欢
关于XML的学习(一)
PS Basic Learning (1)
详解操作符
ML's shap: Based on FIFA 2018 Statistics (2018 Russia World Cup) team match star classification prediction data set using RF random forest + calculating SHAP value single-sample force map/dependency c
Gxlcms有声小说系统/小说听书系统源码
# Dasctf 7月赋能赛 WP
reindex win10
IJCAI2022 Tutorial | Spoken Language Comprehension: Recent Advances and New Fields
【微信小程序】小程序突破小程序二维码数量限制
[MySQL] DQL related operations
随机推荐
for...in 和 for...of 的区别
2022牛客暑期多校训练营1 J Serval and Essay
ThinkPHP high imitation blue play cloud network disk system source code / docking easy payment system program
PyTorch模型导出到ONNX文件示例(LeNet-5)
2022 Nioke Summer Multi-School Training Camp 1 J Serval and Essay
Golang 切片删除指定元素的几种方法
反转链表-就地逆置法
TCP 连接 三次握手 四次挥手
2022.7.30
Navicat cannot connect to mysql super detailed processing method
ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略
PhpMetrics 使用
matlab标量场作图
“蔚来杯“2022牛客暑期多校训练营2 H.Take the Elevator
proxy反向代理
连号区间数
关于XML的学习(一)
"Code execution cannot continue because MSVCP140.dll was not found, reinstalling the program may resolve the problem, etc." Solutions
mysql获取当前时间
Installation and use of cnpm