集合框架
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构,提供了一套性能优良使用方便的接口和类,位于java.util包中,Java中的集合框架主要分为两部分:Collection和Map。
Collection和Map
1.Collection是单列集合,只能存储一种类型的元素;Map是双列集合,使用键值对存储元素,键与值一一对应。
2.Collection下是List、Set、Queue(极少使用)子接口;Map下是AbstractMap和SortedMap子接口。
List和Set
1.List接口实现类中存储有序可重复的元素,Set接口实现类中存储无序不可重复的元素。
2.List和数组相似,可以动态增长,会影响其他元素的位置改变,查找和修改快,增删慢;Set查找和修改慢,增删快,插入和删除不会引起元素位置改变。
3.List接口的主要实现类有ArrayList、LinkedList、Vector;Set接口的主要实现类有HashSet、TreeSet、LinkedHashSet。
4.List的实现类可以存储多个null,Set的实现类最多只能包含一个null。
ArrayList、LinkedList、Vector
1.存储结构:ArrayList和Vector底层为数组,默认的初始容量都为10,因此增删元素时会改变元素位置;LinkedList(JDK1.6之前为循环链表,JDK1.7取消了循环)底层为双向链表,增删元素时不会改变元素位置。
2.线程安全性:ArrayList和LinkedList是线程不安全的,Vector使用了synchronized锁,线程是安全的,但效率比ArrayList和LinkedList低。
3.扩容机制:ArrayList在JDK1.6之前,扩容后的容量是之前的1.5倍+1,JDK1.6后是之前的1.5倍;Vector默认扩容机制为2倍;LinkedList是采用链表存储方式,对容量没有要求,不需要扩容。
4.ArrayList查找和修改快,增删慢;LinkedList查找和修改慢,增删快;Vector查找、修改、增删都慢。
HashSet、TreeSet、LinkedHashSet
1.HashSet由HashMap实现,底层为哈希表;TreeSet由TreeMap实现,底层为红黑树;LinkedHashSet继承于HashSet,是HashSet的一个“扩展版本”,会保持插入顺序。
2.三者都不是线程安全的。
3.HashSet,TreeSet不能有序增删元素,LinkedHashSet可以有序增删元素。
4.HashSet,LinkedHashSet允许有null元素,TreeSet不允许有null元素。
5.TreeSet可实现自动排序,HashSet、LinkedHashSet不能自动排序。
5.由于Set实现类大部分是由Map实现类实现,扩容机制与对应的Map实现类一致。
HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap、HashTable
1.以上都是Map接口的实现类。
2.HashMap、LinkedHashMap、TreeMap线程不安全,ConcurrentHashMap、HashTable是线程安全的。
3.底层结构:
- HashMap在JDK1.8之前为数组+链表,JDK1.8后为数组+链表+红黑树,当链表长度大于阈值(默认为8)时,将链表转化为红黑树。
- LinkedHashMap继承自HashMap,底层结构与之相似,额外持有一个双向链表,维护插入节点的顺序。
- TreeMap底层为红黑树。
- ConcurrentHashMap在JDK1.7时为分段的数组+链表,JDK1.8后为数组+链表+红黑树。
- HashTable底层为数组+链表。
4.扩容机制:
- HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍,也就是容量大小为2的n次方。
- LinkedHashMap继承自HashMap,扩容机制与HashMap一致。
- ConcurrentHashMap相当于HashMap的线程安全版本,扩容机制与HashMap一致。
- HashTable被ConcurrentHashMap取代,现在极少使用,默认的初始容量为11,每次扩充,容量变为原来的2倍+1。
5.HashMap中,允许一个键为null,多个键所对应的值为null;而HashTable中键和值只要有一个为null就会产生NullPointException。
6.实现线程安全的方式中,ConcurrentHashMap在JDK1.7时使用的是Segment(实现了ReentrantLock可重入锁)分段锁,JDK1.8后取消了Segment分段锁,采用CAS(compare and swap,比较交换,乐观锁)和synchronized来保证并发安全;HashTable使用的是同一把锁。
Collection和Collections
1.Collection是Java中所有集合类(接口)的顶级接口,提供了对集合对象进行基本操作的通用接口方法,List和Set都继承了Collection接口。
2.Collections是操作集合的工具类,提供了一系列的静态方法,用于对集合中元素进行排序、搜索及线程安全等操作。
List和Set的区别
List中的元素有序可重复,Set中的元素无序不可重复。
ArrayList和LinkedList以及Vector的区别
1.ArrayList和LinkedList线程不安全,Vector线程安全。
2.ArrayList和Vector底层是数组,LinkedList底层是链表。
3.ArrayList查找和修改快,增删慢;LinkedList查找和修改慢,增删块;Vector查找、修改、增删都慢。
HashSet和TreeSet以及LinkedHashSet区别
1.HashSet底层由哈希表实现,TreeSet底层由二叉树实现,LinkedHashSet底层由链表实现。
2.HashSet打印输出时无序,TreeSet和LinkedHashSet打印输出时有序。
HashMap和TreeMap,HashTable的区别
1.HashMap和TreeMap是线程不安全的,HashTables是线程安全的。
2.HashMap和HashTable底层是哈希表,TreeMap底层是红黑树。
ConcurrentHashMap,HashMap的区别
1.ConcurrentHashMap线程安全,HashMap线程不安全。