一、实现Set的几个类

HashSet、LinkedHashSet、TreeSet、ConcurrentSkipListSet、CopyOnWriterArraySet

二、对应底层的数据结构

HashSet - 哈希表

LinkedHashSet - 哈希表和链表

TreeSet - 红黑树

ConcurrentSkipListSet - 跳表

CopyOnWriteArraySet - 数组列表

三、应用场景

这里先从元素是否有序,按照什么顺序来应用进行Set的选择,最后再从线程安全的角度说一下Set的选择。

1、是否有序

HashSet:

如果对Set的集合插入没有顺序要求,那么推荐使用HashSet。HashSet实际上是使用HashMap的实例(key值为元素,value是一个没有意义的对象,后面篇章再详细说HashMap)。HashSet底层使用的是Hash散列,把元素散列存放在不同的地方(拉链法)。

如果需要有序,就要考虑LinkedHashSet和TreeSet了

2、按照什么顺序来保存Set的元素

LinkedHashSet在HashSet的基础上,使用一个双链表来记录插入的顺序。

TreeSet采用树结构来实现(红黑树算法),也就是TreeSet可以自定义Set中元素的排序规则。

3、是否线程安全

Set集合给出了ConcurrentSkipListSet和CopyOnWriteArraySet两个线程安全的类。

其中CopyOnWriteArraySet像前面文章说的那样,采用读写分离,保留"快照"的方式,因此遍历操作效率比较高且不会和其它线程冲突。

ConcurrentSkipListSet采用跳表的数据结构,它能够保证contains、add、remove的操作是原子性的,再多线程环境下是安全的,但不能保证addAll、removeAll、containsAll这些批量操作在多线程环境下安全。

[知识整理]Java集合(二) - Set的更多相关文章

  1. [知识整理]Java集合

    Mark Java集合图

  2. [知识整理]Java集合(一) - List

    一.实现List的几个类: ArrayList.LinkedList.CopyOnWriteArrayList.Vector 二.几个List底层的数据结构: ArrayList - 数组列表 Lin ...

  3. 《Java基础知识》Java集合(Map)

    Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口. 今天主要讲:Map主要有二个子接口,分别为HashMap.Tr ...

  4. Java集合(二):List列表

    在上一节中,介绍了Java集合的总体情况.从这节開始,将介绍详细的类.这里不单单介绍类的使用方法.还会试图从源代码的角度分析类的实现.这一节将介绍List接口及实现类.即列表中的链表LinkedLis ...

  5. 《Java基础知识》Java集合(Collection)

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

  6. Java基础知识(JAVA集合框架之List与Set)

    List和Set概述数组必须存放同一种元素.StringBuffer必须转换成字符串才能使用,如果想拿出单独的一个元素几乎不可能.数据有很多使用对象存,对象有很多,使用集合存. 集合容器因为内部的数据 ...

  7. 面试知识整理-Java基础

    三大特征:封装,继承,多态 多态:简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情. 抽象:抽象是将一类对象的共同特征总结出来构造类的过程 包装,可以讲基本类型当做对象来使用,抽象只关心对 ...

  8. Java集合(二)--Iterator和Iterable

    Iterable: public interface Iterable<T> { Iterator<T> iterator(); } 上面是Iterable源码,只有一个ite ...

  9. JAVA集合二:HashMap和Hashtable

    参考链接: HOW2J.CN HashMap HashMap实现了JAVA的Map接口,类似于C++的STL框架的Map,是存储键值对的数据结构.键(key)是唯一的,但值(value)可以重复,如果 ...

随机推荐

  1. CentOS7:安装Zabbix

    参考:CentOS 7 yum安装Zabbix 1. 安装Zabbix Server EPEL源里面有Zabbix的安装包,所以需要先安装EPEL. Zabbix源也可以从这里获得:http://re ...

  2. Repeater控件使用中的一些小问题

    网页上用来展示列表的数据,发现还是Repeater比GridView,DetailView之类的要灵活些,所以近期用到了就总结下遇到的一些情况,保留下来以备之后查阅,不用现问度娘了... 自己摸索的, ...

  3. The novaclient Python API

    The novaclient Python API Usage First create a client instance with your credentials: >>> f ...

  4. log level

    ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

  5. Datatable 筛选条件、排序 和获取datagrid当前页面 数据

    1.转化为DataView进行筛选和排序  DataTable dt = BL.UserInfo();//查询返回的DataTable数据 DataTable dt2 = new DataTable( ...

  6. JS传递对象数组为参数给后端,后端获取

    前端JS代码: var conditons = []; var test1 = new Object(); test1.name="1"; test1.id="2&quo ...

  7. oracle修改字段长度

    alter table 表名 modify (字段名 字段类型长度);alter table cachemsg modify (callernum varchar(40));

  8. js的倒计时在ie下显示NAN的最佳解决办法

    写了一个倒计时,原代码如下: var times = new Date(); var timesout = new Date("2016-6-7"); var timesg = t ...

  9. 关于 C# 调用 JavaWebservice服务,版本不一致的问题

    1. A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint.   问题原因: 客户端和服务端的SOAP协议版本不一 ...

  10. JS面向对象的程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...