List——可重复
-
ArrayList:基于数组实现、增删慢、查询快、线程不安全
- 内部数据结构基于数组实现,提供了对List的增加(add)、删除(remove)和访问(get)功能。
- 缺点:元素必须连续存储,当需要在ArrayList的中间位置插入或者删除元素时,需要移动大量元素,修改代价较高,故更适合随机查找和遍历的操作。
- ArrayList不需要在定义时指定数组的长度,在数组长度不能满足存储要求时,ArrayList会创建一个新的更大的数组并将数组中已有的数据复制到新的数组中。
-
Vector:基于数组实现、增删慢、查询快、线程安全
- Vector支持线程同步,即同一时刻只允许一个线程对Vector进行写操作(增删改),以保证多线程环境下数据的一致性,但需要频繁地对Vector实例进行加锁和释放锁操作,因此其读写效率比ArrayList低。
-
LinkedList:基于双向链表实现、增删快、查询慢、线程不安全
- 内部数据结构基于双向链表结构存储元素,在对LinkedList进行插入和删除操作时,根据链表的特性插入删除,故随机访问速度很慢,还提供了在List接口中未定义的方法,用于操作链表头部和尾部的元素,因此有时可以被当做堆栈和队列使用。
Queue——队列结构
- ArrayBlockingQueue(基于数组数据结构实现的有界阻塞队列)/LinkedBlockingQueue(基于链表数据结构实现的有界阻塞队列)
- PriorityBlockingQueue(支持优先级排序的无界阻塞队列)/DelayQueue(支持延迟操作的无界阻塞队列)/SynchronousQueue(用于线程同步的阻塞队列)
- LinkedTransferQueue(基于链表数据结构实现的无界阻塞队列)/LinkedBlockingDeque(基于链表数据结构实现的双向阻塞队列)
Set——不可重复
核心特性:独一无二,适用于存储无序且值不相等的元素。
对象的相等性在本质上是对象的HashCode值相同,Java依据对象的内存地址计算出对象的HashCode值。
如果想要比较两个对象是否相等,则必须同时覆盖对象的hashCode方法和equals方法,并且hashCode和equals方法的返回值必须相同。
-
HashSet:HashMap实现、无序
- HashSet存放的是散列值,它是按照元素的散列值来存取元素的。
- 元素的散列值是通过元素的hashCode方法计算得到的,HashSet首先判断两个元素的散列值是否相等,如果散列值相等,则接着通过equals方法比较,如果equals方法返回的结果也为true,HashSet就视为同一个元素。
-
TreeSet:二叉树实现
- 基于二叉树的原理对新添加的对象按照指定的顺序排序(升序、降序)。
- Integer和String等基础对象类型可以直接根据TreeSet的默认排序进行存储,而自定义的数据类型必须实现Comparable接口,并且覆写其中的compareTo函数才可以按照预定义的顺序存储,compareTo函数:升序—当前对象小于指定对象返回-1。
-
LinkHashSet:继承HashSet、HashMap实现数据存储、双向链表记录顺序
- 在底层使用LinkedHashMap存储元素,它继承了HashSet,所有的方法操作与HashSet相同。
Map
-
HashMap:数组+链表存储数据、线程不安全
- HashMap基于键的HashCode值唯一标识一条数据,同时基于键的HashCode值进行数据的存取,因此可以快速更新和查询数据,但每次遍历顺序无法保证相同,key和value允许为null。
- HashMap是非线程安全的,即在同一时刻有多个线程同时写HashMap时将可能导致数据的不一致。如果需要满足线程安全的条件,可以使用Collections的synchronizedMap方法时HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
- HashMap——capacity:当前数组容量,默认为16,可以扩容,扩容后为当前2倍/loadFactor:负载因子,默认0.75/threshold:扩容的阙值,其值等于capacity*loadFactor
- HashMap在查找数据时根据Hash值可以快速定位数组的具体下标,再对链表进行顺序遍历,时间复杂度为O(n)
- Java8以后对HashMap进行了优化,数据结构修改为数组+链表或红黑树。在链表中的元素超过8个后,HashMap会将链表结构转换为红黑树结构以提高查询效率,时间复杂度为O(logN)
-
ConcurrentHashMap:分段锁实现、线程安全
- ConcurrentHashMap采用分段锁的思想实现并发操作,因此线程安全。其由多个Segment组成(其数量即锁的并发度),每个Segment均继承ReentrantLock并单独加锁,故每个Segment都是线程安全的。
- ConcurrentHashMap默认由16个Segments组成,初始化时设置,不可更改
-
HashTable:线程安全
- 遗留类,功能与HashMap类似,它继承自Dictionary类,线程安全,同一时刻只能有一个线程写HashTable,并发性不如ConcurrentHashMap。
-
TreeMap:基于二叉树数据结构
- 实现了SortedMap接口保障元素的顺序存取,默认按键值的生序排序,也可自定义比较。
-
LinkedHashMap:继承HashMap,使用链表保存插入顺序
- 内部使用链表保存元素插入顺序,当通过Iterator遍历LinkedHashMap时,会按照元素的插入顺序访问元素。