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 ...
随机推荐
- 灵活运用SQL Server SSIS变量
在SSIS开发ETL(Extract-Transform-Load),数据抽取.转换.装载的过程.我们需要自己定义变量 一.SSIS变量简介 SSIS(SQL Server Integration S ...
- 向指定URL发送GET方法获取资源,编码问题。 Rest风格
http编码.今天遇到获取网页上的数据,用HTTP的GET请求访问url获取资源,网上有相应的方法.以前一直不知道什么事rest风格,现在我想就是开一个Controller,然后使人可以调用你的后台代 ...
- Android Animation(动画)
前言 Android 平台提供实现动画的解决方案(三种) 一.3.0以前,android支持两种动画: (1)Frame Animation:顺序播放事先做好的图像,与gif图片原理类似,是一种逐帧动 ...
- [Spring常见问题]java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
这个问题是因为部署在tomcat下的项目中没有springweb包 但是问题来了,但是我的项目中有呀,maven都引了呀,然后我就懵B啦!看到这个博客我就豁然开朗了:http://my.oschina ...
- [MacOS] 终端使用ssh时,中文乱码问题处理
终端显示中文问题处理: vim ~/.inputrc 加入以下代码 set meta-flag on set convert-meta off set input-meta on set output ...
- Linux搭建nfs服务器
使用linux进行嵌入式开发的时候,为了方便开发,通常是将开发板挂载到宿主机的文件系统上,然后将代码放到共享给开发板的目录中,再通过开发板运行. 首先查看是否安装了 nfs 软件包,yum list ...
- 用于svn添加当前目录下所有未追踪的文件,和删除所有手动删除的文件的脚本
由于要经常用到类似与 git 中的 git add --all 这种操作,但是发现svn中并不支持类似的操作. 虽然可以使用 wildcard 进行匹配,但是 wildcard是在shell中进行匹配 ...
- Java开发环境的配置与Hello World
一.Java开发需要做的准备 Java程序的执行过程是首先由Java编译器将以.java为后缀的Java源文件编译成.class字节码文件.然后字节码文件便可以由JVM虚拟机进行加载并执行. 在初学J ...
- IT girl
听着柔和的音乐,敲着自己喜欢的代码......
- JavaScript检测文件上传的类型与大小
$(function(){ $("#files").change(function(){ // 添加允许上传的文件类型 var exts = new Array(); exts[0 ...