集合框架(Java面试题)

1、ArrayList与LinkedList的区别?

一个使用数组一个使用双向循环链表,数组特点、链表特点

2、ArrayList与Vector的区别?

线程安全和线程不安全

3、HashMap和HashTable的区别?

线程安全和线程不安全

4、HashMap和HashSet的区别?

HashSet底层实现就是使用HashMap,几乎继承了HashMap的所有特点

5、HashTable与ConcurrentHashMap的区别?

HashTable线程安全,但是效率非常低,所以发明了ConcurrentHashMap,内部是使用分段锁机制,分割成了多个Hashtable,多个Hashtable间的锁不共享,提高了效率

6、集合框架的分类?

集合框架中有两个最上层街口,一个是Map接口一个是Collection接口,Map接口下主要是实现类有HashMap、HashTable、
ConcurrentHashMap以及Properties等(还有一个TreeMap)
Collection的主要实现类有List接口下的ArrayList、Voctor、LinkedList等(Stack),Set接口下的HashSet等(TreeSet、
TreeHashSet)

7、HashMap的put方法流程是如何?

首先判断key是否为空,如果为null的话就直接插入到数组的第一个位置,不为null时去计算哈希值,在通过hash值去计算
index数组下标位置,然后通过for循环使用equals去判断该下标位置的链表是否有相同的key,存在的话返回覆盖旧Value,
不存在的话先去判断是否需要扩容,再用头插入法存放到链表的第一个位置上。(Hash算法没有去过多了解,只知道是为了
减少哈希冲突)

8、HashMap的get方法流程是如何?

计算key的Hash值,再通过Hash值计算出数组下标位置,如果数组下标位置没有Entry对象则返回null,存在则遍历链表
使用equals去判断。

9、HashMap的扩容流程?为什么扩容是2的幂次方

因为在通过Hash值计算Index的时候是采用哈希值和数组长度-1进行位运算计算的,为了保证能够均匀分布,数组下标-1转换
成二进制需要是都为1,这样就可以使数据均匀分布在数组中

10、HashMap多线程情况下扩容死循环问题

HashMap是线程不安全是,在多线程的情况下多个线程同时对数组进行扩容,其中有一行改变next指针的代码会形成A指向B,
且B指向A,在遍历的时候造成死循环问题,jdk1.8中使用尾插法代替头插法解决了该问题

11、HashMap1.7和1.8的区别?

1.7的HashMap是采用数组加链表的数据结构存储数据,1.8中是采用数组加链表加红黑树的数据结构存储数据,且1.8中使用
尾插法代替头插法解决了1.7中的扩容死循环问题。(node节点,hash算法等)

12、为什么1.8中要加入红黑树?

因为在极端情况下链表会无限延长,链表的查询效率比较低,时间复杂度为O(N),而红黑树的时间复杂度为O(logn),查询效率
比较高,然而为什么不直接使用红黑树,而要使用链表+红黑树,是因为在链表长度小于8的时候,链表和红黑树的查询效率
差不多,而插入效率链表远远大于红黑树,链表长度大于8的时候,使用红黑树查询的效率就大于链表,且链表长度大于8的
概率非常低,所以此时红黑树的插入效率也非常高,综合考虑链表+红黑树的结构会比直接使用红黑树的效率来的高

13、为什么Hashmap中链表要转红黑树,有什么好处?

(1)提升性能,红黑树查询效率比链表高
(2)不用二叉搜索树的原因是二叉搜索树极端情况下会退化成链表
(3)红黑树不追求完全平衡,相比AVL来说减少旋转次数
(4)如果直接使用红黑树的话,添加成本比较高,在链表长度小于8的时候查询效率不会差很多

14、HashMap中如何计算Index值?

通过hash与数组长度-1进行位运算得出数组下标值

15、1.7和1.8Hash算法的区别?

16、为什么有HashCode了还要重新计算哈希值?

17、ConcurrentHashMap是怎么保证线程安全的?

18、数组和集合的区别?

(1)集合可以存放不同类型的数据,数组只能存放相同类型的数据
(2)集合可以用来保存具有映射关系的数据,数组不可以
(3)集合且长度是可以改变的,数组长度是固定的
(4)集合只能存放对象,数组可以存放基本类型

19、集合框架分为哪几类?

(1) Collection接口的子接口包括:Set接口和List接口
(2)Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
(3)List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
(4)Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等

20、红黑树规则

21、为什么HashMap初始容量为16?

22、List遍历集合的三种方式?

(1)for
(2)foreach
(3)iterator
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

23、Collection 和 Collections的区别?Collections的常用方法有哪些

Collection:集合类祖先类
Collections:针对集合类的一个帮助类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操

发布了51 篇原创文章 · 获赞 2 · 访问量 1852

猜你喜欢

转载自blog.csdn.net/qq_42972645/article/details/105657368