面试题总结
1 java 提供的集合工具有哪些
- List常用的有ArrayList,LinkedList
ArrayList的底层实现是数组,LinkedList底层采用链表实现;
- Map常用的有 HashMap,LinkedHashMap,Hashtable,ConcurrentHashMap
HashMap:底层采用数组+链表的形式实现,非线程安全的;
LinkedHashMap:底层同样采用数组+链表的形式实现,但是在遍历的时候可以保证插入的顺序,这一点HashMap是做不到的,它还有一 个比较好的功能是可以当做LUR队列使用,同样是非线程安全的;
Hashtable:和HashMap实现基本一样,但是它是线程安全的,只是在方法中加了同步关键字synchronized;
ConcurrentHashMap,底层同样采用数据+链表,但是它是线程安全的;
TreeMap:底层采用红黑树,实现了按照key的排序
Map在JDK7和JDK8略有区别:第一,JDK8在列表长度超过8的时候会转化为红黑树,提高查询性能,第二个是ConcurrentHashMap的并发 实现略有区别,JDK7是分段锁,意思是每一把锁会锁住Map数组的一段,而JDK8做了优化,直接在每一个数据头加了同步,这样并发能力 大大提高;一般面试的时候如果回答7和8的区别,个人觉得会加分,当然7和8的区别有很多,这里只是列举了和Map相关的点
Map的put过程:忘Map中put的时候会用到Object的俩个函数equals,hashCode,既然说到这俩个函数,那就啰嗦的说一下这俩个函数 的联系吧,equals是比较俩个对象的相等,hashCode是按照某种算法得到一个对象的hash值,如果俩个对象的equals相等,hashCode必 需相等,hashCode相等,equals可以不相等,所以小伙伴们在实现自定义的对象是,一定要注意喽,言归正转,Map的put很简单,就是 先求对象的hashCode,然后找到对应的Map下数组的首元素,然后依次和首元素挂的链表想比较,比较久用到了equals函数,如果相等, 直接替换,否则挂到列表的尾部,如果当前链表已经转化为红黑树了,则按照红黑树的插入逻辑执行即可
- Set常用的有HashSet,LinkedHashSet,TreeSet
HashSet:底层采用HashMap, HashMap的key用来存放Set的值,HashMap中的所有value值对应同一个Object的对象
LinkedHashSet:底层采用LinkedHashMap,可以实现插入的顺序
TreeSet:底层采用的TreeMap
2 集合的扩容
ArrayList默认10,达到以后会进行扩容,LinkedList不存在扩容问题,HashMap默认16,达到后也会扩容