[知识整理]Java集合(二) - Set
一、实现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的更多相关文章
- [知识整理]Java集合
Mark Java集合图
- [知识整理]Java集合(一) - List
一.实现List的几个类: ArrayList.LinkedList.CopyOnWriteArrayList.Vector 二.几个List底层的数据结构: ArrayList - 数组列表 Lin ...
- 《Java基础知识》Java集合(Map)
Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口. 今天主要讲:Map主要有二个子接口,分别为HashMap.Tr ...
- Java集合(二):List列表
在上一节中,介绍了Java集合的总体情况.从这节開始,将介绍详细的类.这里不单单介绍类的使用方法.还会试图从源代码的角度分析类的实现.这一节将介绍List接口及实现类.即列表中的链表LinkedLis ...
- 《Java基础知识》Java集合(Collection)
作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...
- Java基础知识(JAVA集合框架之List与Set)
List和Set概述数组必须存放同一种元素.StringBuffer必须转换成字符串才能使用,如果想拿出单独的一个元素几乎不可能.数据有很多使用对象存,对象有很多,使用集合存. 集合容器因为内部的数据 ...
- 面试知识整理-Java基础
三大特征:封装,继承,多态 多态:简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情. 抽象:抽象是将一类对象的共同特征总结出来构造类的过程 包装,可以讲基本类型当做对象来使用,抽象只关心对 ...
- Java集合(二)--Iterator和Iterable
Iterable: public interface Iterable<T> { Iterator<T> iterator(); } 上面是Iterable源码,只有一个ite ...
- JAVA集合二:HashMap和Hashtable
参考链接: HOW2J.CN HashMap HashMap实现了JAVA的Map接口,类似于C++的STL框架的Map,是存储键值对的数据结构.键(key)是唯一的,但值(value)可以重复,如果 ...
随机推荐
- jenkins中submodule的使用
尝试过各种插件配置都不行. 最后只好通过命令来更新Submodule了. 首先把Git更新到最新,为什么要更新等会儿再说. 项目里的Submodule要配置好,这是基本的. (检查是否配置好的方法: ...
- PHP表单数据验证
背景: 在上次项目的时候,一直不明白为什么要对数据验证,我能保证我每次请求的数据都是合法的,但是在后面的时候,原来“用户”并不是那样听话,他总是要给我们找麻烦,然后可能让我们的服务器崩掉.但是只对单个 ...
- sqlalchemy
#!/usr/bin/env python #coding:utf8 from sqlalchemy import create_engine,and_,or_,func,Table from sql ...
- Microsoft Dynamics AX 2012: How to get Company,Customer and Vendor address in AX 2012
Scenario: “How to get Addresses of “Customer, Vendor and Company” 1) First we need to identify ...
- linux svn hooks代码自动更新至项目
由于开发移动端web,ui需要及时看到样式变化,所以通过svn hooks(钩子)来提交文件,然后再把文件同步到测试服务器项目目录,步骤如下: 1.进入 /home/svn/cmall/hooks ( ...
- Python-5 数据类型、操作符
#1 数值类型: 整型int.浮点型float(科学记数法 e 或 E).布尔型bool #2 字符串: 与整型.浮点型转化:int()--截断处理 float() str() #3 获取数据类型: ...
- 《从零开始做一个MEAN全栈项目》(4)
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 在上一篇中,我们讲了如何去构建第一个Express项目,总结起来就是使用两个核心工具,express和 ...
- ubuntu和win7 64双系统 安装
我是thinkpad机器 主要参考到是http://www.weste.net/2012/4-29/82173.html这个地址到教程,表示感谢 这边说下安装好以后到环境设置 首先要 sudo apt ...
- 再议C风格变量声明
NeoRAGEx2002曾经有一篇文章提到这个问题,但是有很多内容并没有包括,例如const和__declspec. 最近我遇到一些这方面的问题,感觉有必要做一个系统性的总结.后来经过一些实验,得出了 ...
- PLC M8000 M8001 M8002 M8003