Java集合
集合框架
一. 继承体系
参考:
https://blog.csdn.net/qq_43294932/article/details/122997571
二. 必背题
HashMap的扩容机制?
在1.7之前HashMap底层是数组+链表的方式, 在1.7之后, 底层则是数组+链表或红黑树的方式实现的.
当数组长度大于64且链表长度大于8的时候, 链表会转化为红黑树. 否则, 当发生hash碰撞的时候, 会选择扩容, 然后重新分配元素位置.
加载因子默认是0.75, 数组大小默认是16, 每次扩容为原来的两倍.
Map, List, Set区别, 是否允许null键, null值.
map是以键值对的方式去存储数据, List则是以有序的方式存储数据, Set则是无序的.
HashSet底层借助了HashMap实现, 只不过value的值为默认的.
因此, HashMap允许一个null键, 多个null值, List允许多个null值, set则只允许一个null值.
HashMap是线程安全的吗, Hashtable呢?
HashMap不是线程安全的, Hashtable是线程安全的. 但Hashtable已经是过时的, 不推荐在开发中使用, 如果想使用集合并保证线程安全, 可以使用ConcurrentHashMap或者使用Collections的同步方法, 将集合转变为线程安全的.
Hashtable和ConcurrentHashMap的线程安全机制, 区别?
Hashtable底层借助synchronized实现线程安全. 因此, 同一时间只能有一个线程操作Hashtable, 效率上来说比ConcurrentHashmap低太多了.
而ConcurrentHashMap在1.7和1.8之间的实现方式也略有区别.
在1.7中, ConcurrentHashmap使用了segment + synchronized来保证线程安全, 锁是针对segment的, 因此效率上来说比Hashtable高16倍.
在1.8中, 使用 Node + CAS + synchronized来保证线程安全, 锁是针对链表或树的首节点的, 因此, 不发生hash碰撞的时候, 效率比1.7又提升了很多倍.
ArrayList和LinkedList的区别?
ArrayList是基于数组实现的, LinkedList是基于双向链表实现的.
前者基于索引的查找效率高, 后者插入和删除效率高.