Java集合源码分析之Set概述与总结

简介: Java集合源码分析系列到此就结束了,关于Set的知识会在这里进行简单的总结,除此之外,则是学习之后的一些感受。Set概述Set是一个包含不可重元素的集合,也就是所有的元素都是唯一的。文档说明如下:A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this inte

Java集合源码分析系列到此就结束了,关于Set的知识会在这里进行简单的总结,除此之外,则是学习之后的一些感受。

Set概述
Set是一个包含不可重元素的集合,也就是所有的元素都是唯一的。文档说明如下:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.

Set在结构组织上和Map高度一致,也有SortedSet、NavigableSet等接口,且作用也完全一致。这样做是因为Set是基于Map实现的。我们以HashSet为例,它有两个成员变量,如下:

private transient HashMap<E,Object> map;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
我们再看下它的add方法实现,代码如下:

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}
由此可见,HashSet仅仅是对HashMap做了一层包装而已,限定value的值均为恒定的PRESENT对象,从而使我们可以仅操作key。所以掌握了Map,也就掌握了Set。

总结
写了近20篇文章,才把Java集合从头到尾分析透彻。按照文章的顺序,可以清晰地看到JDK的工程师是如何一步步的建立起这个复杂系统的,这也是为何我对所有的API一一罗列了出来。只去分析HashMap等具体实现类的代码,足够去应对面试了,也可以知道如何高效地使用这些结构,但是却失去了学习设计这样一个复杂系统的机会,也就是掌握了实现,却没有把握思想。抽象思想是面向对象编程很重要的一部分,集合的源码设计可以认为是一个典范。

要使用好集合,需要很多的经验和分析能力。首先,数据规模不同,有些结构的表现会有差异,并不是时间复杂度低的结构在任何情况下运行都快。还要看增删改查等操作对需求的重要性,比如需要极其迅速的增删,使用ArrayList显然不合适,对顺序要求严格的,就应该使用手游账号出售基于二叉排序树的TreeMap或TreeSet。哪个因素是系统的瓶颈,就优先考虑它。

此外,在Java的集合类中,大量的依赖于对象的equals、hashCode、clone方法,有些还需要我们实现Comparable接口。如果对数据结构有所理解,又清楚集合类用了哪些个数据结构,我想需要实现哪些方法是可以推测出来的。如果我们能把握这些细节,就能写出更优秀的代码。如果我们能掌握这些思想,就能超脱语言的束缚,理解软件设计的精髓。

如果阅读本系列文章能够给您带来一丁点的提升,对我都是莫大的欣慰与鼓励。

现在,你有把握回答在开篇中提及的几个问题了吗?

Java集合的分析到此正式结束了,但是学习的征程才刚刚开始,本公众号会继续为大家分享更多的编程知识。在这个时代只有持续学习才能不被抛弃,我也是一个正在成长的程序员,希望能和大家一起进步~

如果您有好的文章,可以向我推荐,如果您有好的建议,也可以尽情提出。之后的文章正在紧急筹备,希望大家不要走开,会很快和大家见面哈。

目录
相关文章
|
4月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
183 25
|
8月前
|
开发框架 移动开发 Java
课时2:Java简介(Java发展概述)
课时2:Java简介(Java发展概述) 摘要: 1. Java基础知识:介绍Java作为编程语言及其思想。 2. Java的发展历史:从1991年GREEN项目到1995年正式推出,历经网景公司、HotJava浏览器等关键节点。 3. Java的版本信息:涵盖从JDK 1.0到JDK 1.8的主要版本及特性,如Lambda表达式和模块化支持。
177 0
set集合
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。 LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。 TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
4386 113
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
745 113
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
132 5
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
162 2
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
100 2