一.Set的简介

Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素。对 e1 和 e2,并且最多包含一个为 null 的元素。

Set的类关系图:

1.继承于Collection接口,具有增删查改的方法!

2.AbstractCollection抽象类,实现了Collection接口,并实现了里面的一些方法,如isEmpty、contains等。

3.Set的两个实现类,HashSet和TreeSet

  • HashSet实现本质其实就是HashMap,HashSet里面的元素是无序的。
  • TreeSet实现本质其实就是TreeSet,TreeSet里面的元素是有序的。

二.HashSet

1.概述

HashSet实现Set接口,那么它也是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null!

HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!

  1. Set s = Collections.synchronizedSet(new HashSet(...));

HashSet通过iterator()返回的迭代器是fail-fast的。

2.继承关系和API

HashSet API

  1. HashSet<E>
  2. java.lang.Object
  3. 继承者 java.util.AbstractCollection<E>
  4. 继承者 java.util.AbstractSet<E>
  5. 继承者 java.util.HashSet<E>
  6. 类型参数:
  7. E - set 所维护的元素的类型
  8. 所有已实现的接口:
  9. Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>

LinkedHashSet继承了HashSet,实现链表的set集合。

(1):构造方法

  1. HashSet()
  2. 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75
  3. HashSet(Collection<? extends E> c)
  4. 构造一个包含指定 collection 中的元素的新 set
  5. HashSet(int initialCapacity)
  6. 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
  7. HashSet(int initialCapacity, float loadFactor)
  8. 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

(2)方法:

  1. boolean add(E e)
  2. 如果此 set 中尚未包含指定元素,则添加指定元素。
  3. void clear()
  4. 从此 set 中移除所有元素。
  5. Object clone()
  6. 返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
  7. boolean contains(Object o)
  8. 如果此 set 包含指定元素,则返回 true
  9. boolean isEmpty()
  10. 如果此 set 不包含任何元素,则返回 true
  11. Iterator<E> iterator()
  12. 返回对此 set 中元素进行迭代的迭代器。
  13. boolean remove(Object o)
  14. 如果指定元素存在于此 set 中,则将其移除。
  15. int size()
  16. 返回此 set 中的元素的数量(set 的容量)。

3.总结

HashSet中含有一个"HashMap类型的成员变量"map,HashSet的操作函数,实际上都是通过map实现的。

有两种遍历的方式:

(1)使用 Iterator

第一步:根据iterator()获取HashSet的迭代器。

第二步:遍历迭代器获取各个元素。

  1. for(Iterator iterator = set.iterator();
  2. iterator.hasNext(); ) {
  3. iterator.next();
  4. }

(2)使用foreach

第一步:根据toArray()获取HashSet的元素集合对应的数组。

第二步:遍历数组,获取各个元素。

  1. Object[] object = (String[])set.toArray();
  2. for (Object obj : object)
  3. System.out.printf(obj);

三.TreeSet

1.概述

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。

2.继承关系和API

TreeSet API

(1)继承关系:

  1. TreeSet<E>
  2. java.lang.Object
  3. 继承者 java.util.AbstractCollection<E>
  4. 继承者 java.util.AbstractSet<E>
  5. 继承者 java.util.TreeSet<E>
  6. 类型参数:
  7. E - set 维护的元素的类型
  8. 所有已实现的接口:
  9. Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet<E>, Set<E>, SortedSet<E>

继承于AbstractSet,AbstractSet实现了equals和hashcode方法。

实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。

实现了Cloneable接口,意味着它能被克隆。

实现了java.io.Serializable接口,意味着它支持序列化。

(2)构造方法:

  1. TreeSet()
  2. 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
  3. TreeSet(Collection<? extends E> c)
  4. 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
  5. TreeSet(Comparator<? super E> comparator)
  6. 构造一个新的空 TreeSet,它根据指定比较器进行排序。
  7. TreeSet(SortedSet<E> s)
  8. 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet

(3)方法:

  1. boolean add(E e)
  2. 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
  3. boolean addAll(Collection<? extends E> c)
  4. 将指定 collection 中的所有元素添加到此 set 中。
  5. E ceiling(E e)
  6. 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
  7. void clear()
  8. 移除此 set 中的所有元素。
  9. Object clone()
  10. 返回 TreeSet 实例的浅表副本。
  11. Comparator<? super E> comparator()
  12. 返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null
  13. boolean contains(Object o)
  14. 如果此 set 包含指定的元素,则返回 true
  15. Iterator<E> descendingIterator()
  16. 返回在此 set 元素上按降序进行迭代的迭代器。
  17. NavigableSet<E> descendingSet()
  18. 返回此 set 中所包含元素的逆序视图。
  19. E first()
  20. 返回此 set 中当前第一个(最低)元素。
  21. E floor(E e)
  22. 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
  23. SortedSet<E> headSet(E toElement)
  24. 返回此 set 的部分视图,其元素严格小于 toElement
  25. NavigableSet<E> headSet(E toElement, boolean inclusive)
  26. 返回此 set 的部分视图,其元素小于(或等于,如果 inclusive truetoElement
  27. E higher(E e)
  28. 返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null
  29. boolean isEmpty()
  30. 如果此 set 不包含任何元素,则返回 true
  31. Iterator<E> iterator()
  32. 返回在此 set 中的元素上按升序进行迭代的迭代器。
  33. E last()
  34. 返回此 set 中当前最后一个(最高)元素。
  35. E lower(E e)
  36. 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
  37. E pollFirst()
  38. 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
  39. E pollLast()
  40. 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
  41. boolean remove(Object o)
  42. 将指定的元素从 set 中移除(如果该元素存在于此 set 中)。
  43. int size()
  44. 返回 set 中的元素数(set 的容量)。
  45. NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
  46. 返回此 set 的部分视图,其元素范围从 fromElement toElement
  47. SortedSet<E> subSet(E fromElement, E toElement)
  48. 返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
  49. SortedSet<E> tailSet(E fromElement)
  50. 返回此 set 的部分视图,其元素大于等于 fromElement
  51. NavigableSet<E> tailSet(E fromElement, boolean inclusive)
  52. 返回此 set 的部分视图,其元素大于(或等于,如果 inclusive truefromElement

3.总结

(1)TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。

(2)TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

(3)TreeSet是非同步的方法。 它的iterator 方法返回的迭代器是fail-fast的。

(4)TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

例子:

a.使用Iterator顺序遍历

  1. for(Iterator iter = set.iterator(); iter.hasNext(); ) {
  2. iter.next();
  3. }

b.使用foreach

  1. Object[] object = (Object[])set.toArray();
  2. for (Object obj : object)
  3. System.out.printf(obj);

四.源码

对TreeSet和HashSet的源码不再进行剖析,二者分别是基于TreeMap和HashMap实现的,只是对应的节点中只有key,而没有value,因此对TreeMap和HashMap比较了解的话,对TreeSet和HashSet的理解就会非常容易。

五.总结对比(使用场景)

1.HashSet是一个无序的集合,基于HashMap实现;TreeSet是一个有序的集合,基于TreeMap实现。

2.HashSet集合中允许有null元素,TreeSet集合中不允许有null元素。

3.HashSet和TreeSet都是非同步!在使用Iterator进行迭代的时候要注意fail-fast。


欢迎访问我的csdn博客,我们一同成长!

"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"

博客首页:http://blog.csdn.net/u010648555

java集合系列——Set之HashSet和TreeSet介绍(十)的更多相关文章

  1. Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

    本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...

  2. Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet.内容包括:第1部分 HashSet介绍第2部分 HashSe ...

  3. 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错

    原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学 ...

  4. 【Java集合系列四】HashSet和LinkedHashSet解析

    2017-07-29 16:58:13 一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2 ...

  5. Java 集合系列目录(Category)

    下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...

  6. 【Java集合系列】目录

    2017-07-29 13:49:40 一.Collection的全局继承关系 二.系列文章 [Java集合系列一]ArrayList解析 备注: 1.ArrayList本质上就是一个数组,所有对外提 ...

  7. Java 集合系列 17 TreeSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. shell 之解释器、变量、字符串、数组

    1.Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  2. Linux企业运维人员最常用150个命令汇总

    命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...

  3. Django项目之小博客

    学习了几天Django,学着做了一个简易的小博客,主要用来练习Django基本的操作. 主要用到的命令和Django包.模块等: django.urls.url django.urls.import ...

  4. Python之set

    set set集合,是一个无序且不重复的元素集合 set的优势 set 的访问数度快 set 原生解决数据重复问题 # 数据库中原有 old_dict = { "#1":{ 'ho ...

  5. [2012-04-25]shell大括号参数扩展(Parameter Expansion)

    参考了shell十三问 以及http://hi.baidu.com/leejun_2005/blog/item/ebfee11a4177ddc1ac6e751d.html 提炼下记忆方式: {% ca ...

  6. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  7. 闭锁——CountDownLatch

    一.概念 闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作.例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始. CountDownLatch是concurrent ...

  8. Banner图二三事

      前  言 JRedu 作为一个准前端学员,banner图可是很重要的呢.本人,小白一只,给大家分享几个刚刚学习的基础banner图事件.~~~ 1. 小广告图滚动播放 1.1HTML代码 首先,创 ...

  9. 201521123062《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.pare ...

  10. 201521123072《java程序设计》第三周学习总结

    201521123072<java程序设计>第三周学习总结 标签: java学习 1. 本周学习总结 2. 书面作业 1,代码阅读 public class Test1 { private ...