在java.util中,集合一般分为三类Set、List、map。今天就简单描述一下三种集合相关的面试常问问题。
1.Set
HashSet底层实现:底层为HashMap存储 无序性
保持唯一性:首先HashSet会将对象进行哈希再存储,说先会在hashMap里寻找是否有相拥的哈希code,没有则插入,有则使用eqauls()比较存储在同一个桶内的对象是否相同。
TreeSet底层实现:TreeSet 有序性
2.list
ArrayList:底层实现数组
Linklist:底层实现链表
3.HshMap:
底层实现:如果一个hash值上面低于8个则为链表,多于8个则为红黑树
初始容量 16;
负载因子:0.75
啥是负载因子:举例:当前容量大于最大容量*0.75,则开始扩容
为啥是0.75: 太高查询效率过慢,太低空间开销过大
扩容倍数:2
为啥是2:hashmap计算key值时,将hash出来的code值将数组大小减1进行与运算,经检验,2的倍数时,key指的碰撞率会降低,从而避免查询链表或者红黑树已达到增大效率。
4.集合安全类:
1.原始的安全集合类:HashTable、Vector synchronized修饰的方法,效率非常低
2.修饰的安全集合方法 例子:Collection.synchronizedMap()方法,返回Map类, 不推荐 效率低
3.JUC包中的集合类:
CopyOnWrite类:修改时通过复制的形式保持的一致性,空间开销较大,常用于读操作较多写操作较少的情况
ConCurrent类:通过cas(compare and swap)方式优化,达到高效的高并发。 但在多个线程进行同时读取和修改的同时,读取的结果可能会出现偏差,这就是Concurrent集合类的弱一致性。
ps:
cas表示compare and swap,先比较再替换。
5.红黑树:
几点特性要记住:1.根节点为黑色。2.父子节点不能同时为红色。3.从任意一个节点出发,到叶子节点经历的黑节点树一样多。
1.默认插入色为红色。修复违规的代价比较小
2.修复违规方式:
变色、旋转
3.插入节点时:
根节点时:自身变为黑色
父节点为黑色时:直接插入红色节点
父节点为红色时:要把父节点变为黑色,再插入红节点
uncle为红色时:染红祖父节点,uncle变为黑色
红黑树优势:的最长路径不大于两倍的最短路径的长度