绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Java集合源码分析之Set概述与总结
2020-04-29 09:38:55

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高度一致,也有SortedSetNavigableSet等接口,且作用也完全一致。这样做是因为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的集合类中,大量的依赖于对象的equalshashCodeclone方法,有些还需要我们实现Comparable接口。如果对数据结构有所理解,又清楚集合类用了哪些个数据结构,我想需要实现哪些方法是可以推测出来的。如果我们能把握这些细节,就能写出更优秀的代码。如果我们能掌握这些思想,就能超脱语言的束缚,理解软件设计的精髓。

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

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

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


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


编程之路,道阻且长。唯,路漫漫其修远兮,吾将上下而求索。



分享好友

分享这个小栈给你的朋友们,一起进步吧。

飞机酱的IT之旅
创建时间:2020-04-28 18:20:39
飞机酱是一个Android开发攻城狮,除了要攻陷Android外,还会进攻数据结构、算法、网络、计算机系统等方面的知识。关注我,一起学IT吧。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 大大纸飞机
    栈主

小栈成员

查看更多
  • ☀️
  • 小雨滴
  • 人工智能频道
  • 栈栈
戳我,来吐槽~