jdk源码解析--set
来源:互联网 发布:java断点下载 编辑:程序博客网 时间:2024/06/05 00:10
JDK源码分析Set类,因为Set类是经常要用到的,那我们知道JDK源码中Set类在其中不可以有相同的元素,那么判断这个元素是否相同是如何实现的呢,我们看下下面这张图:
对JDK源码分析之Set类在这张类图上,首先我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下;
首先,我们看一下HashSet
- private transient HashMap map;
- // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?
- public boolean add(E e) {
- return map.put(e, PRESENT)==null;
- }
在HashMap中,我们大多数时候是用value,但是在set的时候,却很好的利用了已有类HashMap,他利用了HashMap的key的唯一性来保证存储在Set中的元素的唯一性;
private static final Object PRESENT = new Object();
是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;
我们最后拿到的迭代器也是:
- public Iterator iterator() {
- return map.keySet().iterator();
- }
Map的keySet的迭代器;
同理,我们看看LinkedhashMap;
- public LinkedHashSet(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor, true);
- }
- /**
- * Constructs a new, empty linked hash set with the specified initial
- * capacity and the default load factor (0.75).
- *
- * @param initialCapacity the initial capacity of the LinkedHashSet
- * @throws IllegalArgumentException if the initial capacity is less
- * than zero
- */
- public LinkedHashSet(int initialCapacity) {
- super(initialCapacity, .75f, true);
- }
- /**
- * Constructs a new, empty linked hash set with the default initial
- * capacity (16) and load factor (0.75).
- */
- public LinkedHashSet() {
- super(16, .75f, true);
- }
调用了父类的构造函数;构造函数如下:
- HashSet(int initialCapacity, float loadFactor, boolean dummy) {
- map = new LinkedHashMap(initialCapacity, loadFactor);
- }
生出了LinkedHashMap;
同理,我们一样可见到TreeMap的实现:
- private transient NavigableMap m;
- // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
更多的,我们也可以理解他是一种桥接模式的一种变形,不过我想从意义上,我更愿意相信其是适配器的应用;
对JDK源码分析之Set类到这里,希望对你有帮助。
阅读全文
0 0
- jdk源码解析--set
- JDk Set及HashSet源码解析
- JDK源码解析之List和Set接口
- JDK 源码 -- SET
- STL源码 SET 解析
- Set接口源码解析
- Set源码解析
- Set接口源码解析
- JDK DualPivotQuicksort 源码解析
- JDK DualPivotQuicksort 源码解析
- JDK DualPivotQuicksort 源码解析
- JDK DualPivotQuicksort 源码解析
- 【JDk源码解析之一】ArrayList源码解析
- Set之HashSet源码解析
- JDK源码分析之Set类详解
- 【JDK源码阅读6-util】Collection-Set
- JDK源码解析之ArrayList
- 【JDK】:CopyOnWriteArrayList、CopyOnWriteArraySet 源码解析
- 【工具】C盘垃圾自动清理软件
- Oracle Histogram 基础介绍
- 数学:非线性方程的求解---(笔记+代码)
- js原生学习-初级-练习03
- JavaScript中的闭包
- jdk源码解析--set
- TensorFlow23: “恶作剧” --人脸检测
- malloc,realloc,calloc和new分配内存
- linux初学者常用的一些命令汇总(自学收集)
- python之函数
- 真Unity3d_如何打包debug文件夹打包成一个exe_执行文件
- ElasticSearch+kibana+logstash监控和分析系统
- Linux使用ssh的简单记录
- android studio调用c文件-小白版本