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
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
3天前
|
存储 Java 开发者
Java Set:无序之美,不重复之魅!
在Java的集合框架中,Set接口以其“无序之美”和“不重复之魅”受到开发者青睐。Set不包含重复元素,不保证元素顺序,通过元素的hashCode()和equals()方法实现唯一性。示例代码展示了如何使用HashSet添加和遍历元素,体现了Set的高效性和简洁性。
11 4
|
3天前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
10 1
|
3天前
|
存储 算法 Java
Java中的Set,你真的了解它的“无重复”奥秘吗?
在Java的广阔天地里,Set以其独特的“无重复”特性,在众多数据结构中脱颖而出。本文将揭秘Set的“无重复”奥秘,带你领略其魅力。Set通过哈希算法和equals()方法协同工作,确保元素不重复。通过一个简单的案例,我们将展示HashSet如何实现这一特性。
10 1
|
4天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
4天前
|
Java 开发者
|
4天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
6 0
|
Java
java中Set,Map,Stack一些简单用法
1 import java.util.Iterator; 2 import java.util.Stack; 3 import java.io.*; 4 import java.util.
632 0
|
10天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
下一篇
无影云桌面