1 ArrayList和LinkedList的区别
-
都是线程不同步的
-
ArrayList底层使用的是Object数组,LinkedList使用的是双向链表
-
增加和删除,当执行普通的增加和删除时,其时间复杂度近似o(1),当指定位置插入/删除时,ArrayList其时间复杂度近似o(n-1),因为其后面的元素需要向后移/向前移,LinkedList的时间复杂度近似o(n)
-
是否支持快速随机访问,ArrayList由于底层是数组,天然的支持随机访问。LinkedList底层是联表,访问某个具体的元素的时候需要循环,所以在访问效率上,前者更加高效
-
内存空间占用,ArrayList的空间浪费主要体现在list列表的结尾都会预留一定的容量空间,而LinkedList的每一个元素都要放一个前驱和后继,所以每一个元素都比ArrayList消耗更大的空间
2 HashMap和HashTable的区别
- 线程安全:HashMap是线程不安全的,HashTable是线程安全的,但是一般在并发中使用concuuentHashMap
- 效率问题:由于锁的问题,hashmao的效率比hashtable的高
- null key和null value:HashMap可以允许存在唯一null 键和多个null值,但是hashtable不允许,会报空指针异常
- 初始化容量大小和扩容量大小不同:hashmap初始容量为16 扩容每次为之前的2n(tableSizeFor方法保证了是2的幂次方) ,hashtable初始容量为11 ,每次扩容为之前的2n+1
- 底层数据结构:hashmap使用的是数组加链表的结构,在链表的长度大于8(阈值)的时候,将链表转化为红黑树,如果链表的长度小于64会先对数组进行扩容,而不是转化红黑树,转化红黑树可以减少搜索时间,hashtable没有这样的机制
3 HashMap和HashSet区别
- 实现的接口不同,前者实现的是map接口,后者实现的是set接口
- 前者储存的是键值对,后者储存的是对象
- 前者使用key计算hashcode 后者使用成员对象计算
- 添加元素的方式,前者是put 后者是add