不同集合的区别

一.集合类结构图

蓝色对应的是接口,黄色对应的是他们各自的实现类。Iterable接口是单列集合的总接口,所有实现了Iterable接口的类都可以使用增强for循环(foreach)来遍历其中的元素。

List继承Collection,存储可重复、有序的对象;

Set继承Collection,存储不可重复、无序的对象;

Map存储键值对,提供key到value的映射,key是无序、唯一,value无序,可重复。 

二.集合特性比较 

Arraylist、LinkedList、Vector和Stack比较

集合实现类底层实现操作效率初始容量扩容机制线程是否安全
ArrayList数组查询快,增删慢10

若是无参构造创建对象:

(1)第一次是10;

(2)第二次数组容量达到上限,开始在原有基础上扩容1.5倍。

若是有参构造创建对象:

(1)数组超过默认容量,开始1.5倍扩容;

(2)可以指定一个数组容量。

线程不安全
LinkedList双向链表增删快,查询慢0线程不安全
Vector数组查询快,增删慢10

(1)数组变为原来的2倍;

(2)可以指定增长因子,用原来的数组加上增长因子的长度。

线程安全,方法加了synchronized同步锁
Stack数组查询快,增删快10

(1)数组变为原来的2倍;

(2)可以指定增长因子,用原来的数组加上增长因子的长度。

Vector子类,线程安全,方法加了synchronized同步锁
HashMap、Hashtable和ConcurrentHashMap比较
集合类底层结构实现方式初始容量扩容机制键值是否为null线程是否安全
HashMap

Java8以前:数组+链表Java8以后:数组+链表+红黑树

继承AbstractMap类16扩容方法为resize()方法,扩容为当前容量2倍键和值都允许为null,并且放在哈希表第一个位置线程不安全
Hashtable数组+链表继承Dictionary类11扩容方法为rehash()方法,扩容为当前容量2倍+1键和值都不允许为null线程安全,使用synchronized同步互斥锁
ConcurrentHashMap

Java8以前:

数组+链表

Java8以后:

数组+链表+红黑树

继承AbstractMap类16扩容方法tryPresize()方法,扩容为当前容量2倍键和值都不允许为null线程安全,使用分段锁实现,Java8之后采用CAS机制来保证线性安全

HashSet、HashMap、TreeSet和TreeMap比较
集合类底层实现数据特点初始容量扩容机制应用场景
HashSet

底层是基于HashMap,HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储一个PRESENT。

数组+链表

在Java8之后又引入红黑树

单列集合,无序存储,不可重复16扩容为数组2倍单列集合中,适用于集合要求去重,查询效率高的场景
HashMap

Java8以前:

数组+链表

Java8以后:

数组+链表+红黑树

双列集合,无序存储,键不可重复,值可重复16扩容为数组2倍双列集合中,追求查询效率高,没有要求线程安全的场景
TreeSet红黑树单列集合,有序存储0单列集合中,要求集合元素有序
TreeMap红黑树双列集合,有序存储0双列集合中,要求集合元素有序存储

 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值