简述 HashSet 实现原理
简述 Java 内置排序算法的实现原理
小于32 二分排序
大于32 优化的归并排序TimSort算法
TimSort算法就是找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来
集合 光云 钉钉 涂鸦 有赞
hashmap说一下?扩容机制是怎么样的,为什么扩容都是2的n次方?
底层通过数据跟链表实现,hash定位数值下表,
put数据 equals 转红黑树 扩容
超过扩容因子*容量 需要扩容2倍 1.利于重新计算hash
说一下怎么保证多线程下hashmap的安全,还有哪些方式?
- 换对象 currenthashMap或者hashtable
Collections.synchronizedMap() 集合工具类转为线程安全类
多线程访问hashmap会出现什么样的问题
死循环问题, put操作触发扩容,1.7采用头插发,get数据会死循环
currenthashMap如何保证线程安全的(分段加锁),jdk1.8怎么实现的
currenthashmap 在jdk1.8进行了哪些优化 分段锁->cas+synchronized+加入红黑树HashMap 与 HashTable 的区别。
主要有以下几点区别。
HashMap 没有考虑同步,是线程不安全的;HashTable 在关键方法
(put、get、contains、size 等)上使用了 Synchronized 关键字,是线
程安全的。- HashMap 允许 Key/Value 都为 null,后者 Key/Value 都不允许为 null。
- HashMap 继承自 AbstractMap 类;而 HashTable 继承自 Dictionary 类
(较为陈旧)。 - 在 jdk1.8 中,HashMap 的底层结构是数组+链表+红黑树,而
HashTable 的底层结构是数组+链表。 - HashMap 对底层数组采取的懒加载,即当执行第一次 put 操作时才会创
建数组;而 HashTable 在初始化时就创建了数组。 - HashMap 中数组的默认初始容量是 16,并且必须是 2 的指数倍数,扩
容时 newCapacity=2oldCapacity;而 HashTable 中默认的初始容量是 11,
并且不要求必须是 2 的指数倍数,扩容时 newCapacity=2oldCapacity+1。
7.在 hash 取模计算时,HashTable 的模数一般为素数,简单的做除取模结
果会更为均匀,int index = (hash & 0x7FFFFFFF) % tab.length; - HashMap 的模数为 2 的幂,直接用位运算来得到结果,效率要大大高于
做除法,i = (n - 1) & hash;