欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-set/

Set概述

 Set几乎都是内部用一个Map来实现, 因为Map里的KeySet就是一个Set,而value是假值,全部使用同一个Object。Set的特征也继承了那些内部Map实现的特征。


HashSet

1. 定义

package java.util;
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();public HashSet() {map = new HashMap<>();}
//其余省略
}

2. 概述

 HashSet是基于HashMap来实现的,操作很简单,更像是对HashMap做了一次“封装”,而且只使用了HashMap的key来实现各种特性,而HashMap的value始终都是PRESENT。
HashSet不允许重复(HashMap的key不允许重复,如果出现重复就覆盖),允许null值,非线程安全
 罗列几个主要方法:

public Iterator<E> iterator() {return map.keySet().iterator();}public int size() {return map.size();}public boolean isEmpty() {return map.isEmpty();}public boolean contains(Object o) {return map.containsKey(o);}public boolean add(E e) {return map.put(e, PRESENT)==null;}public boolean remove(Object o) {return map.remove(o)==PRESENT;}public void clear() {map.clear();}

3. 使用

 案例1:

     Set<String> set = new HashSet<>();set.add("s2");set.add("s3");set.add("s4");set.add("s2");set.add("s5");set.add("s1");set.add(null);set.add("s21");set.add("sw2");set.add("s2");for(String i:set)System.out.println(i);System.out.println(set);

 输出:

null
s2
s1
sw2
s21
s5
s3
s4
[null, s2, s1, sw2, s21, s5, s3, s4]

LinkedHashSet

1. 定义(整个LinkedHashSet的代码)

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);}
}

2. 概述

 HashSet有4个共有的构造函数:

    public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}

 还有一个包级私有的构造函数:

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

 这个构造函数就是LinkedHashSet的关键,整个LinkedHashSet的四个构造函数全部都是调用了HashSet中的这个包级私有的构造函数(构造函数中的dummy就是标记,无实用,为了实现方法的重载而已),也就是说LinkedHashSet就是基于LinkedHashMap实现的

3. 使用

案例2:

        Set<String> set = new LinkedHashSet<>();set.add("s2");set.add("s3");set.add("s4");set.add("s2");set.add("s5");set.add("s1");set.add(null);set.add("s21");set.add("sw2");set.add("s2");for(String i:set)System.out.println(i);System.out.println(set);

 输出:

s2
s3
s4
s5
s1
null
s21
sw2
[s2, s3, s4, s5, s1, null, s21, sw2]

允许null值,保留插入顺序,非线程安全。


TreeSet

1. 定义

package java.util;
public class TreeSet<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable
{private transient NavigableMap<E,Object> m;private static final Object PRESENT = new Object();public TreeSet() {this(new TreeMap<E,Object>());}public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}public TreeSet(Collection<? extends E> c) {this();addAll(c);}public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);}
//其余省略
}

2. 概述

 TreeSet的内部基于TreeMap实现,同样value永远为PRESENT.
 案例3:

        Set<String> set = new TreeSet<String>();set.add("s2");set.add("s3");set.add("s4");set.add("s2");set.add("s5");set.add("s1");
//        set.add(null);set.add("s21");set.add("sw2");set.add("s2");for(String i:set)System.out.println(i);System.out.println(set);

 运行结果:

s1
s2
s21
s3
s4
s5
sw2
[s1, s2, s21, s3, s4, s5, sw2]

不允许重复,不允许null值(如果有基于null的比较器,就可以允许为null),默认按升序排列。
案例4(其中的Person2详细见《Comparable与Comparator浅析》):

        Set<Person2> set = new TreeSet<Person2>(new Comparator<Person2>(){@Overridepublic int compare(Person2 o1, Person2 o2){if(o1==null || o2==null)return 0;return o1.getAge()-o2.getAge();}});Person2 p1 = new Person2("zzh",18);Person2 p2 = new Person2("jj",17);Person2 p3 = new Person2("qq",19);Person2 p4 = new Person2(null,19);set.add(p1);set.add(p2);set.add(p3);set.add(p4);System.out.println(set);

 输出结果:[jj:17, zzh:18, qq:19]
 可以看到不是强制性要求TreeSet的键为null。


参考资料:

  1. 《Comparable与Comparator浅析》

欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-set/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


Java集合框架:Set(HashSet,LinkedHashSet,TreeSet)相关推荐

  1. 集合{LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet 快速失败机制 ConcurrentHashMap CAS 多线程协同扩容}(二)

    目录标题 LinkedHashMap Map集合框架结构体系图 什么是LinkedHashMap Linked 链式 的意思 HashMap "哈希映射"的意思 LinkedHas ...

  2. 三十九、Java集合中的HashSet和TreeSet

    @Author:Runsen @Date:2020/6/6 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

    /*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...

  4. 集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet

    集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet 一.LinkedList 1.L ...

  5. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

  6. Java集合框架的知识总结(1)

    Java集合框架的知识总结(1) 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量). Java的集合类主要由两个接口派生而出:Collection和Map,Collec ...

  7. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

  8. java集合框架综述

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  9. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  10. java集合框架图(一)

    一.集合类简介 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中.从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数 ...

最新文章

  1. java 抓屏_java抓屏代码
  2. 爬取jd商城手机类商品图片
  3. Lammps 问题集锦
  4. 后缀数组--处理字符串的利器
  5. 来自百度的一篇如何关闭Centos7的防火墙以及如何永久关闭防火墙的指令教学【转载】
  6. asn1 pem pfx格式证书_Linux使用openssl管理自签名证书保障网络安全
  7. Visual C# 打造 “浏览器”
  8. 记录最近业务中出现的两个问题
  9. [core java学习笔记][第十一章异常断言日志调试]
  10. Linux--rpm、yum等安装软件
  11. 移远BC95系列区别
  12. InDesign: Interactive Documents InDesign:交互式文档 Lynda课程中文字幕
  13. python监听网络请求_Python实现一个服务器监听多个客户端请求
  14. python中计算结果保留两位小数
  15. 【用python写一个简易的消息轰炸代码】
  16. 全年腾飞计划笔记(腾飞笔记)
  17. Excel-VLOOKUP函数的进阶使用
  18. 南方人和北方人的区别?如何区分南方人和北方人?
  19. [python爬虫]暴力破解Wifi密码
  20. 直播平台搭建iOS 版本打包上架

热门文章

  1. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
  2. YOLO Object Detection with OpenCV
  3. dsPIC30F 细节点问题不定期更新ing
  4. 一次java导出pdf的经历
  5. 新加坡樟宜机场将进入“刷脸”时代 自助通关是亮点
  6. PowerShell【变量篇】
  7. Flask中的请求上下文和应用上下文
  8. 与众不同 windows phone (15) - Media(媒体)之后台播放音频
  9. 【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
  10. nginx 漏洞(适用于0.1.0-0.8.14)补丁