面试题总结——集合
0、集合类框架及对应数据结构
SortSet:有序的Set
Deque:双端队列
SortedMap:有序的Map
1、ArrayList与LinkedList的区别?
①ArrayList内部是一个数组,如果通过有参构造参数传入一个长度,ArrayList中就会开辟一个定长
的数组。如果调用ArrayList的无参构造,默认会开辟一个长度为10
的数组。若容量已满,ArrayList扩容1.5倍
(新容量/旧容量==1.5)
②LinkedList是一个链表
由于底层是链表与数组,这道题实际上是在问链表与数组的区别。
2、ArrayList与Vector的区别(两者底层均由数组实现)?
①产生版本:ArrayList从JOK1.2开始提供;Vector从JDK1.0开始
②线程安全:ArrayList采用异步处理,性能较高,线程不安全;Vector采用在方法上添加synchronized来保证线程安全,性能较低
③初始化策略:ArrayList使用懒加载策略,在构造方法阶段并不初始化对象数组,在第一次添加元素时才初始化数组大小为10; Vector在无参构造执行后就将对象数组大小初始化为10
④扩容策略:ArrayList扩容为原数组的1.5倍,Vector扩容为原数组的2倍
⑤遍历:ArrayList和Vector都使用Iterator,ListIterator,foreach,但Vector还会使用Enumeration。(老版迭代器)
2*.集合中线程安全的数据结构:喂(Vector),S(Stack)H(HashTable)E(Enumation),SB(StringBuilder)
3、Collections.sort()的实现原理是什么?
Collections.sort()本质上是将比较器作为参数调用了Arrays.sort(),而在Arrays.sort()中采用的是归并排序
,具体的执行流程请参考:sort()的排序
4、Comparable和Comparator的区别?
Comparable(“内部比较器”)是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,类中的int compareTo(T t)是一个内部比较方法(用当前对象与传入对象进行比较),可以直接存放在TreeMap/TreeSet中
Comparator(“外部比较器”)是比较器接口,若类本身不支持排序,可自定义一个第三方的比较器(实现Comparator的类),使用compare(T o1,T o2)进行两个对象的比较。
5、foreach的原理
foreach能使用的本质是各个集合类都内置了迭代器(集合类对象.iterator()即可取得迭代器),foreach被编译器编译后变为了Iterator迭代器,因此foreach就是迭代器的简化使用版。
6、迭代器Fail-fast机制是什么?