一、ArrayList 和 LinkedList区别:
(1)两者都是线程不安全,都实现了Collection接口。
(2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是基于双向链表的数据结构。
(3)性能:ArrayList支持随机访问,查询快,增删慢,查询的时间复杂度为O(1),插入和删除的时间复杂度为O(n),因为对插入和删除位置后面的元素进行移动位置,以保证内存的连续性
LinkedList不支持随机访问,查询慢,增删快,查询的时间复杂度为O(n),插入和删除的时间复杂度为O(1)
ArrayList:
- get() 直接读取第几个下标,复杂度 O(1);
- add(E) 添加元素,直接在后面添加,复杂度O(1);
- add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n);
- remove()删除元素,后面的元素需要逐个移动,复杂度O(n)。
LinkedList:
- get() 获取第几个元素,依次遍历,复杂度O(n);
- add(E) 添加到末尾,复杂度O(1);
- add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n);
- remove()删除元素,直接指针指向操作,复杂度O(1)。
(4)空间的消耗:ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
二、ArrayList和Vector的区别:
(1)数据结构:ArrayList和Vector底层的数据结构都是数组。
(2)线程安全:Vector线程安全的,底层使用synchronize进行加锁,而ArrayList是线程不安全的。
(3)性能:由于Vector使用synchronize锁来确保线程的安全性,所以性能会稍逊于ArrayList。
(4)初始容量和扩容:ArrayList和Vector的默认初始容量都是10,但是扩容时,ArrayList容量会增长为原来的1.5倍,而Vector的容量会增长为原来的2倍。
(5)Vector实现的Enumeration接口,所以可以使用Enumeration进行遍历元素。
三、HashMap和Hashtable的区别:
(1)线程安全性:这是两者最主要的区别,Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些。
(2)计算hash值的方式:HashMap中元素的hash值是重新计算过的,以便获得更好的散列值,Hashtable直接使用Object的hashcode
(3)数据结构:在JDK1.8之前,HashMap和Hashtable的数据结构都可以看成“数组+链表”;在JDK1.8之后,HashMap的数组结构变成了“数组+链表+红黑树”
(4)两者均实现了Map接口,但是HashMap继承了AbstractMap,HashTable继承Dictionary抽象类
(5)HashMap允许null值和null键(只允许一个),HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。
(6)HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。扩容时,HashMap的容量变成原来的2倍,Hashtable的容量变为2倍+1
(7)Hashtable实现了Enumeration接口,所以可以使用Enumeration进行遍历元素
(8)判断是否含有某个键 :HashMap去掉了Hashtable中的contains()方法
在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。
Hashtable 的键值都不能为null,所以可以用get()方法来判断是否含有某个键。
四、HashMap和HashSet的区别: