Collection
00 min
2024-8-21
notion image

ArrayList和LinkedList的区别?

ArrayList默认初始容量是10,(无参构造默认是0,插入元素后数组长度才变成10),当添加第十一个元素的时候发生扩容,变为15(原来的1.5倍)

HashMap

如何解决Hash冲突?

HashMap底层用数组这种数据结构存储数据,数组的默认长度是16,当我们向数组中put数据的时候,对数据的hashcode()进行取模运算,由于数据是无限的而数组的下标位置是有限的所以避免不可会出现Hash冲突,HashMap中使用的是链表寻址法,就是当出现Hash冲突的时候,后边的数据通过尾插法插入到链表的尾部,但为了数据的查询效率,当链表长度>8并且数组长度>=64,链表将会传唤为红黑树,提升查询效率。
另外解决Hash冲突
  • 线性探测法 ThreadLocal
  • 再Hash法 Redis布隆过滤器
  • 溢出区存储法

谈一下HashMap的扩容机制

HashMap初始数组容量大小是16,当数据超出临界值threshold就会发生扩容,
threshold=loadFactor*capacity,默认loadFactor是0.75,换句话说默认情况下当threshold达到12时发生扩容,其实底层就是数组拷贝,capacity变为原来的2倍
所以当我们定义HashMap时,最好提前设置好初始容量,这样可以有效的降低扩容对性能的影响

谈一下HashMap和ConcurentHashMap的区别

HashMap是线程不安全的、ConcurentHashMap是线程安全的,底层把锁的粒度控制在分段上,给每一段数据配一把锁,当一个线程占用锁访问其中一个段的数据的时候,其他段的数据也能并访问,实现了并发访问,
上一篇
DDD
下一篇
Sodility语言