Java 集合 - HashSet
一、源码解析
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); //构造函数。 new 一个空的 HashMap(hashmap 默认的初始化容量是 16,默认加载因子是 0.75)。 public HashSet() { map = new HashMap<>(); } // 构造函数。new 一个 HashMap并且为其添加一个 collection。根据 collection 的大小来自定义初始化容量 public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } // 构造函数。new 一个空的 HashMap,自定义初始化容量和加载因子 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } // 构造函数。new 一个空的 HashMap,自定义初始化容量 public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } // 得到迭代器,也就是得到了一个 map 的 key 值的集合 public Iterator<E> iterator() { return map.keySet().iterator(); } // 得到元素个数,也就是 hashmap 的元素个数 public int size() { return map.size(); } // 判断是否为空,也就是判断 hashmap 是否为空 public boolean isEmpty() { return map.isEmpty(); } // 判断是否包含某元素,也就是判断 hashmap 的key 中有没有这个元素 public boolean contains(Object o) { return map.containsKey(o); } // 添加一个元素。也就是为 hashmap 添加一个 key 为 e的元素,而 value 是 PRESENT 对象 // 添加成功就会返回 true。不允许添加重复元素(返回 false)。 public boolean add(E e) { return map.put(e, PRESENT)==null; } // 删除一个元素 public boolean remove(Object o) { // hashmap 根据 key 删除这个元素,如果删除成功,就会返回这个元素而且必定是 PRESENT。 return map.remove(o)==PRESENT; } // 清空集合,也就是 map 清空集合 public void clear() { map.clear(); } }
二、总结
1). HashSet 实际上就是维护了一个 HashMap。HashSet 的元素对应的是 HashMap 中的 key,另外这个 HashMap 所有 key 对应的 value 都是 PRESENT。
2). 由于 HashSet 是一个 HashMap 的所有 key 的集合,因为 key 能为空,不能重复,所以 HashSet 也是允许元素为空,不允许重复元素。
就这样吧,如果对 HashMap 理解透彻,HashSet 就会很简单了。
~~
Java 集合 - HashSet的更多相关文章
- Java集合 -- HashSet 和 HashMap
HashSet 集合 HashMap 集合 HashSet集合 1.1 Set 接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 1. ...
- java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重
package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...
- Java集合 HashSet的原理及常用方法
目录 一. HashSet概述 二. HashSet构造 三. add方法 四. remove方法 五. 遍历 六. 合计合计 先看一下LinkedHashSet 在看一下TreeSet 七. 总结 ...
- Java集合---HashSet的源码分析
一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二. ...
- java集合-HashSet源码解析
HashSet 无序集合类 实现了Set接口 内部通过HashMap实现 // HashSet public class HashSet<E> extends AbstractSet< ...
- 3.Java集合-HashSet实现原理及源码分析
一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...
- java集合-HashSet
HashSet 概述 对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的 ...
- Java集合:HashSet的源码分析
Java集合---HashSet的源码分析 一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该 ...
- Java集合之HashSet
1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...
随机推荐
- nginx1.8安装nginx_concat_module及400错误解决办法
nginx安装concat模块可以合并js,css等静态资源,减少http请求 在nginx源码目录执行命令: ./configure --user=www --group=www --prefix= ...
- Pointcut is malformed: Pointcut is not well-formed: expecting 'identifier' at character position 0 ^
错误提示: 解决方法:指定execution 在执行目标方法之前指定execution 例如: import org.aspectj.lang.annotation.Aspect; import or ...
- Hihocoder 1059 String Matching Content Length
预处理下连续相等的字符个数其实主要是看是否满3个 后面递推的时候特判下+1上次递推[i-1,j-1]不是来自[i-2,j-1]也不是来自[i-1,j-2]其实就是只来自[i-4,j-4]+3,和[i- ...
- ASCII码表(二进制 十进制 十六进制)
css里,允许使用转义字符\+ascii16进制形式; 例如: e的ascii 16进制是65,我们就写为\65 expression -> expr\65ssion 二进制 十进制 十六进制 ...
- 常用git命令总结
这些命令是最常用的,一般的提交代码.拉取代码.合并代码.分支切换等等操作用这些命令就足够了. 1.git init 把一个目录初始化成git仓库 2.git add test.txt 把文 ...
- RGB颜色表
RGB(255,23,140)是光的三原色,也即红绿蓝Red.Green.Blue,它们的最大值是255,相当于100%. 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:r ...
- css实现三角形箭头
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android studio 中的配置编译错误总结
1.编译Andorid 工程的时候,有时候出现gradle 报下面的错误. Error:(1, 0) Cause: com/android/build/gradle/LibraryPlugin : U ...
- 学习了quartz.net2.0的心得
由于项目中要运用到此调度方法,所以抽空学习了下,简单的用法可以掌握了 首先作为没有用过的人来说,怎么用呢? 于是百度了下原来先要下载 quartz.net2.0, 然后我就去下了个quartz.net ...
- C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0
C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0