博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashSet、LinkedHashSet、TreeSet
阅读量:6838 次
发布时间:2019-06-26

本文共 3198 字,大约阅读时间需要 10 分钟。

以下内容基于jdk1.7.0_79源码;

关于HashSet、LinkedHashSet、TreeSet

Set接口的实现类,最大特点是不允许出现重复元素;

HashSet:基于HashMap实现,一个性能相对较好的Set;

LinkedHashSet:基于LinkedHashMap实现,一个保存了插入顺序的Set;

TreeSet;基于TreeSet实现,一个实现了排序的Set;

类图关系

源码分析

Set接口的实现类相对来说都比较简单,如果熟悉HashMap、LinkedHashMap、TreeMap源码的话,HashSet、LinkedHashSet、TreeSet的代码会很好理解,因为基本上都是调用对应Map的方法来实现的;

HashSet部分源码

package java.util;public class HashSet
extends AbstractSet
implements Set
, Cloneable, java.io.Serializable{ static final long serialVersionUID = -5024744406713321676L; //存储元素的HashMap private transient HashMap
map; // 一个冗余的空对象,用于在Map中存放key对应的value,Map中所有的键值对的value都是同一个空Object的引用 private static final Object PRESENT = new Object(); /** * 构造方法,直接生成一个对应的HashMap */ public HashSet() { map = new HashMap<>(); } //省略一部分代码..... //返回HashMap的key迭代器,HashSet中的元素实际上就是HashMap中的key元素 public Iterator
iterator() { return map.keySet().iterator(); } //调用HashMap的put方法,将e-PRESENT键值对对象put到map中 public boolean add(E e) { return map.put(e, PRESENT)==null; } //省略一部分代码.....}

LinkedHashMap源码,如下,代码很少,主要是构造方法,

根据传入的参数,调用父类HashSet的HashSet(int initialCapacity, float loadFactor, boolean dummy)方法,生成一个LinkedHashMap对象存储集合元素:

package java.util;public class LinkedHashSet
extends HashSet
implements Set
, Cloneable, java.io.Serializable { private static final long serialVersionUID = -2851667679971038690L; public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); } public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); } public LinkedHashSet(Collection
c) { super(Math.max(2*c.size(), 11), .75f, true); addAll(c); }}

HashSet中生成LinkedHashMap的构造方法HashSet(int initialCapacity, float loadFactor, boolean dummy)

HashSet(int initialCapacity, float loadFactor, boolean dummy) {        map = new LinkedHashMap<>(initialCapacity, loadFactor);    }

TreeSet部分源码

有一个NavigableMap类型的Map和一个空对象,NavigableMap会在构造方法里被赋成一个TreeMap对象,PRESENT是所有键值对中value对象的同一个引用;

public class TreeSet
extends AbstractSet
implements NavigableSet
, Cloneable, java.io.Serializable{ /** * TreeMap对象 */ private transient NavigableMap
m; // 空对象,所有Map键值对中value对象的同一个引用 private static final Object PRESENT = new Object();

构造方法,可见TreeSet是基于TreeMap实现的:

TreeSet(NavigableMap
m) { this.m = m; } public TreeSet() { this(new TreeMap
()); }

再看其它TreeSet中方法的源码,基本都是通过调用TreeMap的方法实现;

//省略部分代码。。。 public NavigableSet
descendingSet() { return new TreeSet<>(m.descendingMap()); } public int size() { return m.size(); } public boolean isEmpty() { return m.isEmpty(); }//省略部分代码。。。

补充一句

学好Set集合的关键是把Map学好。

 

转载于:https://www.cnblogs.com/chenpi/p/5297472.html

你可能感兴趣的文章
mongo explain分析详解
查看>>
软件测试艺术一:程序正确性证明
查看>>
面向对象课程第二单元作业总结
查看>>
2549 自然数和分解
查看>>
ATL CLR MFC Win32 常规 的区别
查看>>
查看SQL Server Resource Database以及修改系统表
查看>>
scau实验题 8596 Longest Ordered Subsequence
查看>>
getopt例子
查看>>
浅说Java中的反射机制(一)
查看>>
jquery之行自加自减
查看>>
单向链表的有关操作(链式存储结构)
查看>>
Spring @PostConstruct and @PreDestroy example
查看>>
软件架构师2
查看>>
单链表的操作
查看>>
没事抽空学——常用界面组件属性
查看>>
《程序员代码面试指南》第二章 链表问题 构造链表和节点的实体
查看>>
【LeanEAP.NET】精益企业应用平台---源码&Demo下载
查看>>
Django restfulframework 开发相关知识 整理
查看>>
去掉数组中重复的数字。
查看>>
Poj 2887-Big String Splay
查看>>