JAVA集合面试题

1. Arraylist与LinkedList区别


        ArrayList是数组的数据结构,LinkedList是链表的数据结构。
随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于索引
(index)的数据结构,可以直接映射到。
插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。
LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。
ArrayList的默认初始容量为10 (这个容量可以自定义),扩容机制是当前容量的1.5倍进行扩容
 

2. Collections.sort和Arrays.sort的实现原理


        Collection.sort是对list进行排序,Arrays.sort是对数组进行排序。
Collections.sort底层实现 ,就是调用了Arrays.sort()方法
Arrays的sort方法底层就是:
legacyMergeSort(a),归并排序,
ComparableTimSort.sort():即Timsort排序。Timsort排序是结合了合并排序
(merge.sort)和插入排序(insertion sort)而得出的排序方法;1.当数组长度小于某个值
(默认是32),采用的是二分插入排序算法。


3. HashMap原理,java8做了什么改变


       HashMap是以键值对存储数据的集合容器
HashMap是非线性安全的。
HashMap底层数据结构:数组+(链表、红黑树),jdk8之前是用数组+链表的方式实现,jdk8引进了
红黑树
Hashmap数组的默认初始长度是16,key和value都允许null的存在
HashMap的内部实现数组是Node[]数组,上面存放的是key-value键值对的节点。HashMap通过
put和get方法存储和获取。
HashMap的put方法,首先计算key的hashcode值,定位到对应的数组索引,然后再在该索引的单
向链表上进行循环遍历,用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有
则向后追加。
jdk8中put方法:先判断Hashmap是否为空,为空就扩容,不为空计算出key的hash值i,然后看
table[i]是否为空,为空就直接插入,不为空判断当前位置的key和table[i]是否相同,相同就覆盖,
不相同就查看table[i]是否是红黑树节点,如果是的话就用红黑树直接插入键值对,如果不是开始遍
历链表插入,如果遇到重复值就覆盖,否则直接插入,如果链表长度大于8,转为红黑树结构,执
行完成后看size是否大于阈值threshold,大于就扩容,否则直接结束。
Hashmap解决hash冲突,使用的是链地址法,即数组+链表的形式来解决。put执行首先判断
table[i]位置,如果为空就直接插入,不为空判断和当前值是否相等,相等就覆盖,如果不相等的
话,判断是否是红黑树节点,如果不是,就从table[i]位置开始遍历链表,相等覆盖,不相等插入。
HashMap的get方法就是计算出要获取元素的hash值,去对应位置获取即可。
HashMap的扩容机制,Hashmap的扩容中主要进行两步,第一步把数组长度变为原来的两倍,第
二部把旧数组的元素重新计算hash插入到新数组中,jdk8时,不用重新计算hash,只用看看原来
的hash值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组
长度,如果是零就插入到原数组中。扩容过程第二部一个非常重要的方法是transfer方法,采用头
插法,把旧数组的元素插入到新数组中。
HashMap大小为什么是2的幂次方?效率高+空间分布均匀

4. TreeMap底层?


        TreeMap实现了SotredMap接口,它是有序的集合。
TreeMap底层数据结构是一个红黑树,每个key-value都作为一个红黑树的节点。
如果在调用TreeMap的构造函数时没有指定比较器,则根据key执行自然排序。


5. HashMap的扩容过程


Hashmap的扩容:
第一步把数组长度变为原来的两倍,
第二步把旧数组的元素重新计算hash插入到新数组中。
jdk8时,不用重新计算hash,只用看看原来的hash值新增的一位是零还是1,如果是1这个元素在
新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。扩容过程第二步一
个非常重要的方法是transfer方法,采用头插法,把旧数组的元素插入到新数组中。将新旧数组的
长度(length-1)&hash然后将这两个值比较是新增加1还是0。

6. LinkedHashMap的应用,底层,原理


        LinkedHashMap维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭
代顺序可以是插入顺序(insert-order)或者是访问顺序,其中默认的迭代访问顺序就是插入顺
序,即可以按插入的顺序遍历元素,这点和HashMap有很大的不同。
LRU算法可以用LinkedHashMap实现。


7. ArrayList和 Vector的区别是什么?


Vector是线程安全的,ArrayList不是线程安全的。
ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
Vector只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。

你可能感兴趣的:(java,数据结构,链表)