Java集合面试

文章目录

      • Java集合框架
        • 说说有哪些常见的集合?
        • ArrayList和LinkedList的区别?
        • HashMap的数据结构?把你了解的所有都讲一讲?
          • 数据结构:
        • put流程
        • Hashmap的resize方法的执行过程?
        • get流程
        • JDK8 HashMap为什么引入红黑树?解决了什么问题?
        • HashMap什么情况下会触发扩容呢?
        • HashMap与ConcurrentHashMap的区别是什么?
        • HashMap和HashTable的区别?
        • HashMap和HashTable的区别?

Java集合框架

说说有哪些常见的集合?

集合相关类和接口都在Java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。

Java集合面试_第1张图片

ArrayList和LinkedList的区别?

ArrayList基于动态数组实现,所以它的查找效率高,增删效率慢

LinkedList基于双向循环链表实现,它的查找效率低,增删效率快

HashMap的数据结构?把你了解的所有都讲一讲?

数据结构:

1.7 数组+链表 1.8 采用数组+链表+红黑树

数组用来确定元素的位置;链表用来解决哈希冲突;红黑树提高查询效率

红黑树:

​ 根节点必须是黑色

​ 所有结点非黑即红

​ 红结点两个子结点一定是黑色

​ 任意结点到叶子结点,包含的黑色结点数目相同

put流程

​ 1.首先hash算法计算出哈希值

​ 2.判断数组是否需要扩容,是就执行resize方法扩容

​ 3.然后根据哈希值去数组寻找下标

​ 4.判断下标对应位置是否为空

​ 是的话就直接插入

​ 否的话就判断key是否相同

​ 相同的话直接覆盖

​ 不相同转到5

​ 5.判断是否为树节点(判断是否为红黑树)

​ 是的话在树中插入键值对

​ 否的话进行下一步

​ 6.遍历链表,判断key是否存在,

​ 存在的话就覆盖

​ 不存在的话插入链表尾部

​ 插入之后判断链表长度是否>8

​ 大于转为红黑树

​ 不大于就结束

​ 7.判断容量是否达到扩容阈值

​ 是就执行resize方法扩容

​ 否就结束

Hashmap的resize方法的执行过程?

两种情况会调用resize方法

1.第一次调用Hashma的put方法时,会调用resize方法对table数组进行初始化,如果不传入指定值,默认为16.

2.扩容时会调用resize方法,即size大于数组阈值threshold时,数组大小翻倍。

get流程

​ 1.根据哈希值到数组对应下标寻找元素

​ 判断是否是要查找的元素

​ 是就返回

​ 2.判断是否为树节点

​ 是就遍历红黑树查找

​ 3.判断是否为链表

​ 是就遍历链表查找

JDK8 HashMap为什么引入红黑树?解决了什么问题?

引入红黑树我认为是这样,当产生hash冲突时会形成链表,当数据多了冲突多了,链表会越来越长,造成链化,此时查询特别耗时间,本来时间复杂度为O(1)结构可能达到O(n),引入红黑树可以优化查询。

HashMap什么情况下会触发扩容呢?

当它未初始化,第一个put时会触发扩容。后面插入值,当大于扩容阈值时

HashMap与ConcurrentHashMap的区别是什么?

HashMap不是线程安全的,而ConcurrentHashMap是线程安全的.

ConcurrentHashMap采用锁分段技术,整个ConcurrentHashMap由一个个Segment组成,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap的key和value都允许为null,而Hashtable的key和value都不允许为null,Hashtable遇到null,直接返回NullPointerException

你可能感兴趣的:(面试总结,java,面试,python)