简述 HashSet 实现原理

内置hashmap,key为放入的对象

简述 Java 内置排序算法的实现原理

小于32 二分排序
大于32 优化的归并排序TimSort算法
TimSort算法就是找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来

集合 光云 钉钉 涂鸦 有赞
hashmap说一下?扩容机制是怎么样的,为什么扩容都是2的n次方?
底层通过数据跟链表实现,hash定位数值下表,
put数据 equals 转红黑树 扩容
超过扩容因子*容量 需要扩容2倍 1.利于重新计算hash

说一下怎么保证多线程下hashmap的安全,还有哪些方式?

  1. 换对象 currenthashMap或者hashtable
  2. Collections.synchronizedMap() 集合工具类转为线程安全类

    多线程访问hashmap会出现什么样的问题

    死循环问题, put操作触发扩容,1.7采用头插发,get数据会死循环
    currenthashMap如何保证线程安全的(分段加锁),jdk1.8怎么实现的
    currenthashmap 在jdk1.8进行了哪些优化 分段锁->cas+synchronized+加入红黑树

    HashMap 与 HashTable 的区别。

    主要有以下几点区别。

  3. HashMap 没有考虑同步,是线程不安全的;HashTable 在关键方法
    (put、get、contains、size 等)上使用了 Synchronized 关键字,是线
    程安全的。

  4. HashMap 允许 Key/Value 都为 null,后者 Key/Value 都不允许为 null。
  5. HashMap 继承自 AbstractMap 类;而 HashTable 继承自 Dictionary 类
    (较为陈旧)。
  6. 在 jdk1.8 中,HashMap 的底层结构是数组+链表+红黑树,而
    HashTable 的底层结构是数组+链表。
  7. HashMap 对底层数组采取的懒加载,即当执行第一次 put 操作时才会创
    建数组;而 HashTable 在初始化时就创建了数组。
  8. HashMap 中数组的默认初始容量是 16,并且必须是 2 的指数倍数,扩
    容时 newCapacity=2oldCapacity;而 HashTable 中默认的初始容量是 11,
    并且不要求必须是 2 的指数倍数,扩容时 newCapacity=2
    oldCapacity+1。
    7.在 hash 取模计算时,HashTable 的模数一般为素数,简单的做除取模结
    果会更为均匀,int index = (hash & 0x7FFFFFFF) % tab.length;
  9. HashMap 的模数为 2 的幂,直接用位运算来得到结果,效率要大大高于
    做除法,i = (n - 1) & hash;