一、实现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. #define中 #与##用法

    参考自: http://zjf30366.blog.163.com/blog/static/411164582009061075923/ #include<cstdio> #include ...

  2. .net 环境下get 获取页面出现乱码问题解决

    不多说了,先上代码: /// <summary> /// 获取页面内容 /// </summary> /// <param name="Url"> ...

  3. Linux学习笔记之——安装虚拟机后,如何启用网卡

    版本:CentOS-6.5-i386-minimal 虚拟机:vmware 11.1.2   安装完之后是看不到网卡信息的,如下:         我们编辑网卡etho的配置信息:         将 ...

  4. oracle大表添加字段default经验分享

    当oracle单表数据量上亿时,对表进行alter table aa add column_1 varchar2(2) defalut 'Y';时,效率及安全性是必须考虑的因素. 本帖以2亿的数据表a ...

  5. mac-终端命令

    发现一个比较好点的关于mac终端下命令的解释文档,全文粘贴到这,免得丢了(原文在此): Mac终端 命令行 [一]bash 终端设置      1.环境变量设置首先要知道你使用的Mac OS X是什么 ...

  6. 通过WMI接口监控服务器性能

    WMI 是微软操作系统的一个内置的组件,通过使用WMI我们可以获取服务器硬件信息.收集服务器性能数据.操作Windows服务,甚至可以远程关机或是重启服务器. 一.在C#编程中使用WMI 要想在C#程 ...

  7. 转载-------makefile 使用总结

    转载自:http://www.cnblogs.com/wang_yb/p/3990952.html 1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的 ...

  8. SDE用户密码到期

    系统使用Arcsde for oracle 11g ,一直使用正常,突然有一天客户打电话说系统中地图不显示了.登陆GIS服务器,发现sde数据已经无法链接,错误提示:“ [ORA-28002: the ...

  9. Jmeter组件8. BeanShell Sampler

    BeanShell是一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性,像JavaScript和perl那样 ...

  10. 微信连wifi

    微信连wifi 首先需要到微公众平台添加微信连wifi功能插件