File tree Expand file tree Collapse file tree 1 file changed +22
-5
lines changed Expand file tree Collapse file tree 1 file changed +22
-5
lines changed Original file line number Diff line number Diff line change 1
1
# 集合框架面试题和解析
2
2
3
+ ** 为什么要设计出迭代器**
4
+
5
+ 迭代器本质是一种设计模式,为了解决为不同的集合类提供统一的遍历操作接口。
6
+
3
7
## List、Set、Map 之间的区别
4
8
5
9
** List**
63
67
64
68
65
69
66
- ## HashMap的实现原理
70
+ ## 说说 HashMap
71
+
72
+ 1.内部存储结构:数组+链表+红黑树(JDK8)
73
+
74
+ 2.默认容量16(数组长度),默认装载因子0.75。
75
+
76
+ 3.key 和 value 对数据类型的要求都是泛型。
67
77
68
- 数组+链表+红黑树实现。详见java容器总结篇。
78
+ 4.key 可以为 null,放在 table[ 0] 中。
79
+
80
+ 5.hashcode:计算键的hashcode作为存储键信息的数组下标用于查找键对象的存储位置。equals:HashMap 使用 equals() 判断当前的键是否与表中存在的键相同。
69
81
70
82
## HashMap 的长度为什么是2的幂次方
71
83
72
84
HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法;这个算法实际就是取模,hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1),
73
85
74
86
** hash%length==hash&(length-1)的前提是 length 是2的 n 次方;**
75
87
76
- ## 在 Queue 中 poll()和 remove()有什么区别?
88
+ ## HashMap 1.7和1.8版本区别
77
89
78
- poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
90
+ * ** 数据结构:** 1.7:数组+链表,1.8:数组+链表+红黑树
91
+ * ** 新节点插入方式:** 1.7:头插法 ,1.8:直接在尾部插入
92
+ * ** 扰动运算次数:** 1.7:运算多,1.8:运算少
93
+ * ** 插入和扩容的判断:** 1.7:先扩容后插入,1.8:先插入后扩容
94
+ * 为什么?1.8增加了判断是否为红黑树节点,先扩容的话不知道到底扩链表节点还是红黑树。
79
95
80
96
## ConcurrentHashMap线程安全的实现方式
81
97
@@ -116,5 +132,6 @@ String、Integer等包装类的特性能够保证Hash值的不可更改性和计
116
132
117
133
Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。
118
134
135
+ ## 在 Queue 中 poll()和 remove()有什么区别?
119
136
120
-
137
+ poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
You can’t perform that action at this time.
0 commit comments