HashSet、LinkedHashSet、TreeSet
以下内容基于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<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {static final long serialVersionUID = -5024744406713321676L;//存储元素的HashMapprivate transient HashMap<E,Object> 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<E> 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<E>extends HashSet<E>implements Set<E>, 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<? extends E> 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<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable {/*** TreeMap对象*/private transient NavigableMap<E,Object> m;// 空对象,所有Map键值对中value对象的同一个引用private static final Object PRESENT = new Object();
构造方法,可见TreeSet是基于TreeMap实现的:
TreeSet(NavigableMap<E,Object> m) {this.m = m;} public TreeSet() {this(new TreeMap<E,Object>());}
再看其它TreeSet中方法的源码,基本都是通过调用TreeMap的方法实现;
//省略部分代码。。。public NavigableSet<E> descendingSet() {return new TreeSet<>(m.descendingMap());}public int size() {return m.size();} public boolean isEmpty() {return m.isEmpty();} //省略部分代码。。。
补充一句
学好Set集合的关键是把Map学好。
HashSet、LinkedHashSet、TreeSet相关推荐
- Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet
Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...
- Java 之HashSet、LinkedHashSet、TreeSet比较
4.HashSet.LinkedHashSet.TreeSet比较 Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不 ...
- 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别
[JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...
- Java15-day06【Set、HashSet、LinkedHashSet、TreeSet、Comparable、Comparator、泛型类、可变参数的使用】
视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java ...
- Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet
文章目录 Set接口概述 HashSet实现类 LinkedHashSet实现类 TreeSet实现类 Set接口概述 1.Set接口是Collection的子接口,set接口没有定义额外的方法,使用 ...
- HashSet、LinkedHashSet、TreeSet 简明解释
HashSet:元素无序.比如存入a.e.c.d.b,输出d.e.b.c.a. LinkedHashSet:怎么存进去,怎么出来.比如存入a.e.c.d.b,输出a.e.c.d.b. TreeSet: ...
- 集合深度学习07—Set、HashSet、LinkedHashSet、TreeSet、 底层原理 源码解析
一.Set接口 特点: 唯一 无序(相对List接口部分来说的,无序不等于随机) 没有索引相关的方法 遍历方式: 迭代器 增强 for 循环(底层还是 Itr 迭代器) 二.HashSet 1. Ha ...
- 【JAVA】List转Set并按照List的顺序排序,HashSet、LinkedHashSet、TreeSet元素保存顺序List转换对比
话不多说 直接代码测试效果: // 简化代码 直接 数组转list 就不用 写很多add了 哈哈哈 String[] array = {"f","a",&quo ...
- Day48(List接口,ArrayList,LinkedList,Vector,Set接口,HashSet,LinkedHashSet,TreeSet,自然排序,定制排序)
Collection子接口之一:List接口 List接口概述 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中元素有序.且可重复,集合中的每个元素都有其对应的顺 ...
最新文章
- 从LSTM到GRU基于门控的循环神经网络总结
- 特朗普即将主持AI会议 中美竞争成焦点
- Bash 实例,第 2 部分
- css控制的代码,通过CSS控制把网页上的代码美化
- JerryScript:物联网开发者的得力工具
- 上海电子信息职业技术学院计算机网络技术,上海电子信息职业技术学院计算机网络技术专业...
- 160304-01、mysql数据库插入速度和读取速度的调整记录
- Canvas API - 江苏黑马 - 博客园
- 网页输出pdf并转为word
- ES中 minimum_should_match 的用法和误区
- openmv图像格式不支持问题解决方案
- qsnctf 哥哥打篮球 wp
- python3 字符串转list的另类方法
- Ubuntu下使用NI-VISA控制USB接口仪器(示波器)
- 大数据导论习题_2020智慧树答案 大数据概论 最新知到章节测试答案
- 联通无线网卡人工服务器,联通无线上网卡怎么用 联通无线上网卡使用步骤【详解】...
- 关于文件夹和快捷方式
- 计算机桌面输入法没有了怎么办,输入法不见了怎么办,小编教你电脑输入法不见了怎么办...
- 十个最好的免费杀毒软件下载
- linux虚拟机流畅,启用3D加速让Ubuntu 20.04虚拟机更快更流畅