HashSet 集合,从入门到精通
时间:2025-11-05 15:54:31 出处:域名阅读(143)
哈喽,入门大家好,到精我是入门指北君。
本篇文章指北君给大家介绍一个集合——HashSet,到精这也是现在面试必问的一个集合,通常用于存放不能重复的入门数据,可以说这个集合是到精HashMap 的儿子,为什么这样说呢?入门看完你就明白了
在 JDK1.8 中,HashMap 是到精由 数组+链表+红黑树构成,相对于早期版本的入门 JDK HashMap 实现,新增了红黑树作为底层数据结构,到精在数据量较大且哈希碰撞较多时,入门能够极大的到精增加检索的效率。了解 HashMap 的入门具体实现后,我们再来介绍由 HashMap 作为底层数据结构实现的到精一种数据结构——HashSet。(如果不了解 HashMap 的入门实现原理,建议先看看 HashMap,不然直接看 HashSet 是很难看懂的)。
1.HashSet 定义
HashSet 是一个由 HashMap 实现的源码库集合。元素无序且不能重复。
public class HashSet
extends AbstractSet
implements Set<E>, Cloneable, java.io.Serializable
和前面介绍的大多数集合一样,HashSet 也实现了 Cloneable 接口和 Serializable 接口,分别用来支持克隆以及支持序列化。还实现了 Set 接口,该接口定义了 Set 集合类型的一套规范。
2.字段属性
//HashSet集合中的内容是通过 HashMap 数据结构来存储的
private transient HashMap
//向HashSet中添加数据,数据在上面的 map 结构是作为 key 存在的,而value统一都是 PRESENT
private static final Object PRESENT = new Object();第一个定义一个 HashMap,作为实现 HashSet 的数据结构;第二个 PRESENT 对象,因为前面讲过 HashMap 是作为键值对 key-value 进行存储的,而 HashSet 不是键值对,那么选择 HashMap 作为实现,其原理就是存储在 HashSet 中的数据 作为 Map 的 key,而 Map 的value 统一为 PRESENT(下面介绍具体实现时会了解)。网站模板
3.构造函数
①无参构造 public HashSet() {
map = new HashMap<>();
}直接 new 一个 HashMap 对象出来,采用无参的 HashMap 构造函数,具有默认初始容量(16)和加载因子(0.75)。
②指定初始容量 public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}③指定初始容量和加载因子public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}④构造包含指定集合中的元素
public HashSet(Collection c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}集合容量很好理解,这里我介绍一下什么是加载因子。在 HashMap 中,能够存储元素的数量就是:总的容量*加载因子 ,新增一个元素时,如果HashMap集合中的元素大于前面公式计算的结果了,那么就必须要进行扩容操作,从时间和空间考虑,加载因子一般都选默认的0.75。
4.添加元素
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}通过 map.put() 方法来添加元素,在上一篇博客介绍该方法时,说明了该方法如果新插入的key不存在,则返回null,如果新插入的key存在,则返回原key对应的value值(注意新插入的value会覆盖原value值)。
也就是说 HashSet 的免费信息发布网 add(E e) 方法,会将 e 作为 key,PRESENT 作为 value 插入到 map 集合中,如果 e 不存在,则插入成功返回 true;如果存在,则返回false。
5.删除元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}调用 HashMap 的remove(Object o) 方法,该方法会首先查找 map 集合中是否存在 o ,如果存在则删除,并返回该值,如果不存在则返回 null。
也就是说 HashSet 的 remove(Object o) 方法,删除成功返回 true,删除的元素不存在会返回 false。
6.查找元素
public boolean contains(Object o) {
return map.containsKey(o);
}调用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。
7.遍历元素
HashSet
set.add(1);
set.add(2);
//增强for循环
for(Integer i : set){
System.out.println(i);
}
//普通for循环
Iterator
while (iterator.hasNext()){
System.out.println(iterator.next());
}8.小结
好了,这就是JDK中java.util.HashSet 类的介绍。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!
猜你喜欢
- 卧龙大数据(发挥数据的力量,卧龙大数据引领行业变革)
- 选择适合家庭的无线路由器的关键因素(从速度到覆盖,了解如何选择最佳的无线路由器)
- 东芝电视机——优质画质与卓越性能的完美结合(领先科技打造的电视娱乐新体验)
- 电脑应用程序打开错误的解决方法(应对电脑应用程序无法打开的常见问题及解决方案)
- 先介绍一下环境:虚拟机:debian7.2.0主机: Win7由于有时候无法联网就需要离线安装软件包,可以把debian官网上列出的几个DVD镜像都下下来,其实主要是DVD1,这样就不需要每次安装软件都得联网。下面是我从Debian官网上下下来的DVD镜像:debian-7.2.0-i386-DVD-1debian-7.2.0-i386-DVD-2debian-7.2.0-i386-DVD-3在每张DVD中都有一个README.txt,其中有如下说明:About This Disc =============== This disc is labeled Debian GNU/Linux 7.2.0 Wheezy - Official i386 DVD Binary-1 20131012-12:56 which means that this disc is number 1 of a set of 10 discs It contains programs (binaries) for `i386 computers. The programs on the Binary discs are ordered by popularity. The Binary-1 disc contains the most popular programs and the installation tools; it is possible to install and run Debian with only the Binary-1 disc. The other discs, up to Binary-10, contain mostly special-interest programs. The Release Notes for wheezy are available on the Debian web site. 在DVD1中有关于Debian的安装手册,中文的手册路径是doc/manual/zh_CN/,其中也有关于DVD安装的介绍CD(和 DVD) 里面包含的软件包按照流行程度排列次序。也就是说,第一张光盘里面是最常用的软件,而最后一张光盘里面包含的是很少有人用到的软件。这也意味着购买或者下载刻录所有 CD 是一种浪费,因为大部分光盘您根本不会用到。多数情况下,只需要使用前 3 到 8 张 CD,然后从网络镜像安装其他要用的软件包。DVD 的情况类似:只要一张,或者前两张 DVD 就能满足您大部分要求。根据经验,常见的桌面安装(使用 GNOME 桌面环境)只需要前三张 CD。其他的桌面环境(KDE 或 Xfce),就需要额外的 CD。而第一张 DVD 就可以轻松地满足所有的三种桌面环境。 下面开始安装:先给虚拟机添加三个虚拟光驱,将刚下载的三个DVD镜像装入如下图所示:(注意:由于已经安装了Debian7.2,所以我把DVD1放在了第二个,即第一IDE控制器从通道,将DVD2放在了第一IDE控制器主通道上,目的是防止每次启动时都自动进入Debian安装界面,DVD1中也有很多软件包)由于添加了三个虚拟光驱,需要修改/etc/fstab,修改为:同时在/media目录下新建一个目录cdrom2,重启后系统就自动把DVD2挂载到/media/cdrom0,将DVD1挂载到/media/cdrom1,将DVD3挂载到/media/cdrom2下面,如下图:挂载好之后,就可以修改/etc/apt/sources.list了,添加如下内容:假如不知道路径后面写什么可以执行 apt-cdrom add,系统会自动搜索cdrom,并自动填写/etc/apt/sources.list文件,可以看他是怎么写的,使用apt-cdrom add这种方法,有事会出现无法找到软件包的问题。最后就可以执行 apt-get update了。
- 以德意灶具(探索高品质、高效能的烹饪体验)
- 美图M6s后置照相表现如何?(一款令人期待的手机摄影利器)
- 深入探析BOSS直聘企业的优势与特点(打造高效求职平台,助力企业招聘新篇章)
- 解决电脑打开参数错误的问题(分析参数错误的原因和解决方法)