多线程与高并发(三)

1. 集合类关系

集合类都存放于 java.util 包中,分别是:list(列表,包含Queue),set(集),map(映射)。
Collection:list,queue,set 的基本接口。
Map:映射表的接口。
Iterator:迭代器,可以遍历集合中的数据。
关系图

2. Collection

List,Set,Queue 的父接口。

2.1 List

List 是有序可重复的集合。

实现内部实现特点线程是否安全
ArrayList数组查询快,增删慢
LinkedList双向链表查询慢,增删快
Vector数组查询快,增删慢

2.1.1 ArrayList

ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

2.2.2 LinkedList

LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

2.2.3 Vector

效率低,几乎已经被淘汰,Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList慢。

2.2.4 CopyOnWriteArrayList

写时复制的集合,写时加锁,读时不加锁,适用于读特别多、写很少的场景。
添加元素的过程,不直接在当前容器中添加,先把当前容器copy一个新的,然后再新的容器中添加元素,最后再将原容器的引用指向新容器。这样,在读的过程中,容器不会有变化,不需要加锁,但是,会有弊端,写时会同时占用两块内存,而且在写的过程中会出现数据不一致的情况,保证的是最终一致性。

2.2 Set

Set 是无序(存入和取出顺序不一定相同)不可重复的集合。

实现底层特点线程是否安全
HashSethash表存取快
TreeSet二叉树/红黑树排序存储
LinkedHashSethash表双向链表记录插入顺序,哈希表保证唯一性

2.2.1 HashSet

HashSet 存储的数值和索引之间有确定的关系:index = hash(value), 只要通过hash函数就可以找到元素或索引。
对于 HashSet,通过 equal() 返回 true ,则这两个对象的 hashCode 值也相等。
存入元素过程

  • 调用该对象的 hashCode() 方法,获取 hashCode 值,然后获取到的值得到对象在HashSet中的存储位置。
  • 若 hashCode 值不同,直接存储到 hashCode() 指定的位置。
  • 若 hashCode 值相同,则通过 equal() 判断值是否相等,值相等,视为同一个对象,不保存,值不相等,存储在对象通草为的链表上。
    HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元

2.2.2 TreeSet

有序,不可重复。
自定义的对象必须实现 Comparable 接口,并覆写 compareTo() 方法,Integer 和 String 可以按默认排序。
覆写 compareTo() 的规则:
- 如果 this > obj,返回正数 1
- 如果 this < obj,返回负数 -1
- 如果 this = obj,返回 0

2.2.3 LinkedHashSet

有序,不可重复。底层采用 HashSet + LinkedHashMap 实现的,LinkedHashMap 保证元素的添加顺序,HashSet 保证元素的唯一性。

2.3 queue

多线程高并发是用,具体可 参考(二)

3. Map

存储 key-value 的键值对,key 不允许重复,value 可重复

实现底层线程是否安全
HashMap哈希表允许key值为null,value值也可以为空
HashTable哈希表key、value都不能为空
TreeMap二叉树/红黑树查找方便

3.1 HashMap

HashMap 不带锁,是线程不安全的,若需要满足线程安全,可以用 synchronizedMap 方法,使的 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。synchronizedMap 适用于高并发执行时间长的场景,比 HashTable 的锁力度稍小。ConcurrentHashMap 采用的是CAS 操作,也可以使用在高并发执行时间长的场景,读的效率高,写的效率不高。
LinkedHashMap ,是 HashMap 的一个子类,保存了记录的插入顺序。

3.2 HashTable

在新代码中不建议使用,与 HashMap 的功能类似,但效率低。不需要线程安全的场景可以使用 HashMap,需要线程安全的场景可以使用 ConcurrentHashMap。

3.3 TreeMap

TreeMap 实现 SortedMap 接口,用Iterator 遍历的结果,是按key排序以后的。
ConcurrentSkipListMap ,线程安全的有序的哈希表,适用于高并发的场景,是通过跳表实现的,在链表的基础上加了层级,用CAS处理比TreeMap方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值