以下内容基于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相关推荐

  1. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  2. Java 之HashSet、LinkedHashSet、TreeSet比较

    4.HashSet.LinkedHashSet.TreeSet比较 Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不 ...

  3. 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别

    [JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...

  4. Java15-day06【Set、HashSet、LinkedHashSet、TreeSet、Comparable、Comparator、泛型类、可变参数的使用】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  5. Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

    文章目录 Set接口概述 HashSet实现类 LinkedHashSet实现类 TreeSet实现类 Set接口概述 1.Set接口是Collection的子接口,set接口没有定义额外的方法,使用 ...

  6. 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: ...

  7. 集合深度学习07—Set、HashSet、LinkedHashSet、TreeSet、 底层原理 源码解析

    一.Set接口 特点: 唯一 无序(相对List接口部分来说的,无序不等于随机) 没有索引相关的方法 遍历方式: 迭代器 增强 for 循环(底层还是 Itr 迭代器) 二.HashSet 1. Ha ...

  8. 【JAVA】List转Set并按照List的顺序排序,HashSet、LinkedHashSet、TreeSet元素保存顺序List转换对比

    话不多说 直接代码测试效果: // 简化代码 直接 数组转list 就不用 写很多add了 哈哈哈 String[] array = {"f","a",&quo ...

  9. Day48(List接口,ArrayList,LinkedList,Vector,Set接口,HashSet,LinkedHashSet,TreeSet,自然排序,定制排序)

    Collection子接口之一:List接口 List接口概述 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中元素有序.且可重复,集合中的每个元素都有其对应的顺 ...

最新文章

  1. 从LSTM到GRU基于门控的循环神经网络总结
  2. 特朗普即将主持AI会议 中美竞争成焦点
  3. Bash 实例,第 2 部分
  4. css控制的代码,通过CSS控制把网页上的代码美化
  5. JerryScript:物联网开发者的得力工具
  6. 上海电子信息职业技术学院计算机网络技术,上海电子信息职业技术学院计算机网络技术专业...
  7. 160304-01、mysql数据库插入速度和读取速度的调整记录
  8. Canvas API - 江苏黑马 - 博客园
  9. 网页输出pdf并转为word
  10. ES中 minimum_should_match 的用法和误区
  11. openmv图像格式不支持问题解决方案
  12. qsnctf 哥哥打篮球 wp
  13. python3 字符串转list的另类方法
  14. Ubuntu下使用NI-VISA控制USB接口仪器(示波器)
  15. 大数据导论习题_2020智慧树答案 大数据概论 最新知到章节测试答案
  16. 联通无线网卡人工服务器,联通无线上网卡怎么用 联通无线上网卡使用步骤【详解】...
  17. 关于文件夹和快捷方式
  18. 计算机桌面输入法没有了怎么办,输入法不见了怎么办,小编教你电脑输入法不见了怎么办...
  19. 十个最好的免费杀毒软件下载
  20. linux虚拟机流畅,启用3D加速让Ubuntu 20.04虚拟机更快更流畅

热门文章

  1. 【RMAN】正确删除归档日志的方式
  2. 在线文本按列截取工具
  3. android modbus 串口,android modbus RTU jssc连接
  4. 深度解析 | K8S API Server之请求处理
  5. li下的ul----多级列表
  6. 更新导致Svchost CPU100%(转)
  7. 410. 分割数组的最大值
  8. STL源码剖析-map
  9. 26muduo_net库源码分析(二)
  10. 19muduo_base库源码分析(十)