先上图:
一、自己了解
Java的集合类主要有List、Set和Map三大类,其中,List和Set是Collection接口一脉,Map接口自成一脉。
其中,还有两个工具类Arrays和Collections
二、学习了解
1.List
List的特性是按顺序插入,可重复,允许null值。实现List接口的集合主要有:ArrayList,LinkedList,Vector和Stack。
简单地讲一下:
ArrayList是动态数组,底层是数组,默认初始化大小是10,可以动态扩容1.5倍,线程不安全。适用于随机访问。
LinkedList底层是双向链表,线程不安全。由于是双向链表,访问时需要从头部或者尾部进行遍历,适用于插入删除比较多的操作
Vector底层也是数组,类似于ArrayList,但是它是线程安全的。
Stack是继承Vector类的,实现了一个先进后出的栈结构,其中Stack提供了额外的5个方法。基本的push和pop操作,以及peek操作,empty方法判断栈空,search方法检测一个元素在栈中的位置。Stack刚创建后是一个空栈。
2.Set
Set的特性是无序,不可重复,允许null值但只允许一个。实现Set接口的集合主要有HashSet、TreeSet、EnumSet
HashSet底层是用HashMap实现的,用哈希表实现的(数组+链表)
TreeSet底层是用TreeMap实现的,用的是红黑树实现的。
3.Map
上面讲的Collection叫做集合,Map叫做映射。如下图:
图来源Java3y
Map集合的特点:将键映射到值得对象,一个映射不能包含重复的键,每个键最多只能映射一个值。
Map与Collection的区别在于Map是以键值成对存储的,键是唯一的,值是可以重复的;Collection集合存在元素是单独的,其中Set是唯一的,List是可重复的。
要点在于Map针对键,Collection针对值。
三、 深入了解(基于JDK1.8)
1.LinkedList ArrayList Vector的区别
区别之处 |
ArrayList |
LinkedList |
Vector |
底层实现 |
基于动态数组 |
基于双向链表 |
基于动态数组 |
初始容量 |
10 |
10 |
|
扩容大小 |
增长原数组大小的50% |
增长原数组大小的100% |
|
是否线程安全 |
不安全 |
不安全 |
安全 |
各自优点 |
适用随机访问,查询效率比LinkedList和Vector高 |
插入速度快,适用于插入和删除较多的操作。 |
查询效率比ArrayList低,适用于数据量较大的数据 |
2.HashMap HashTable ConcurrentHashMap的区别
区别 |
HashMap |
HashTable |
ConcurrentHashMap |
TreeMap |
底层实现 |
数组+链表+红黑树 |
数组+链表 |
JDK1.7 ReentrantLock+Segment+HashEntry JDK1.8 Synchronized+CAS+Node+红黑树 |
红黑树 |
初始容量 |
16(2的n次幂) |
11 |
16 |
|
负载因子 |
0.75 |
0.75 |
0.75 |
|
扩容大小 |
原大小的2倍 |
原大小的2倍+1 |
原来的2倍 |
|
是否线程安全 |
不安全 |
安全 |
安全 |
不安全 |
各自特点 |
HashMap可以将空值作为一个表的条目的key或value |
已经过时 |
ConcurrentHashMap的key和Value都不能为null |
TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap |
3.HashSet与HashMap TreeSet与TreeMap的关系
HashSet依赖HashMap
TreeSet依赖TreeMap