与集合相关问题的总结

https://mp.weixin.qq.com/s/20df3rxU1yOb2QvqNrE5JA转载于JAVA面试通关手册

1.Arraylist 与 LinkedList 异同

1.均是非线程安全;
2.ArrayList底层数组实现;LinkedList是双向链表实现;
3.ArrayList插入add()直接从数组末尾插入,复杂度O(1),按照位置插入
则需要向后移动元素O(n);LinkedList插入均为O1);
4.ArrayList支持RandomAccess接口,LinkedList则不支持当真正对数组进行添加时
,才真正分配容量。每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。
6. ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

2.ArrayList 与 Vector 区别

Vector的所有方法都实现了同步,比较耗费资源。

3.HashMap的底层实现

1.是一个基于数组-链表结构的数据结构,通过关键词的哈希函数得到哈希值,然后
为了分配链表长度均匀,采用了取余的算法,此处除数为2的幂次是因为,这个取
余数的操作可以转化为对哈希值和哈希值减一做与运算,与运算的效率要比取余高。
如果产生了哈希冲突,则在数组后的链表中插入数据。
2.查找方法,如果没有哈希冲突,那么一次就可以找到,如果有链表,那么遍历链表;
插入也是,如果没有哈希冲突,一次就可以,如果有链表,直接插入链表头即可;
3.JDK1.8之后,对于HashMap进行了优化,即当链表节点数大于8(阈值)的时候,
将链表结构变为红黑树,以减少搜索时间
4.哈希表相对于链表查找快,相对于数据插入快

4.HashMap 和 Hashtable 的区别

1.HashMap不能保证线程安全,Hashtable通过sychronized实现线程安全;
2.HashMap效率高(因为没有Sychronized)
2.Hashtable JDK1.8以后并没有像HashMap一样利用红黑树优化
4.HashMap支持只有一个NULL的键值,支持多个键值对的VALUE为NULL5.a.初始容量hashtable是11,之后扩容每次2n+1;hashmap是16,扩容是两倍
b.初始化如果hashtable给了指定容量,则按该值初始化;hashmap是扩容到2的幂次
原因见问题5

5.HashMap 的长度为什么是2的幂次方

见第三个问题

6.HashSet 和 HashMap 区别

1.hashmap实现map接口;hashset实现set接口
2.hashmap利用key计算hashcode;hashset利用成员对象计算
3.所以hashmap比hashset效率高
4.hashmap用put添加;hashset用add
5.hashmap存储键值对;hashset存储对象

7.ConcurrentHashMap 和 Hashtable 的区别

1.底层结构 jdk1.8后CurrentHashMap也采用了数组+链表/红黑树;
而HashTable则依旧是数组+链表
2.实现同步方式
a.CurrentHashMap JDK1.8之前采用Segment的概念,即每把锁只锁其中
的一部分,提高了访问率并发率,1.8之后采用sychronized和CAS模式
(1.6之后优化了sychronized)
b.Hashtable就采用一个锁的模式,效率很低

8.ConcurrentHashMap线程安全的具体实现方式/底层具体实现

1.ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组,
当修改HashEntry数组采用开链法处理冲突,所以它的每个HashEntry元素又是链表结构的
元素。
所以我觉得hashentry更像是Hashmap,而segment负责每个hashentry的锁实现。
2.currenthashmap jdk1.8之后 通过sychronized+CAS实现同步;只锁定链表或二叉
树的首节点,只要哈希值不冲突,就不会产生并发

9.集合框架底层数据结构总结

1.list
arraylist:数组
vector:数组
linkedlist:双向链表
2.set
hashset(无序,唯一):基于hashmap实现,底层采用hashmap的数据结构
linkedhashset:继承与hashset,内部实现与linkedhashmap很像
treeset(有序,唯一):红黑树
3.map
hashmap:不说了
linkedhashmap:继承自hashmap,同时添加了双向链表,实现了访问顺序的操作
hashtable:不说
treemap:红黑树(自平衡二叉树)

产生的疑问:
红黑树和CAS的原理!

猜你喜欢

转载自blog.csdn.net/weixin_38719347/article/details/82691095
今日推荐