【2024JAVA集合之面试】【精华!!!】

说明:

本文章针对于JDK8

如果本文中有错误的地方,欢迎指正!!!



java集合框架体系

请添加图片描述

java.util.Collection:存储一个一个的数据

  • 子接口:
    • List:存储有序的、可重复的数据
    • ArrayList(主要实现类)、LinkedList、Vector
  • 子接口:
    • Set:存储无序的、不可重复的数据
    • HashSet(主要实现类)、LinkedHashSet、TreeSet

java.util.Map:存储一对一对的数据(key-value)键值对,

  • HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

List及其实现类特点?

  • ArrayList 基于动态数组实现,支持随机访问。
  • Vector 和 ArrayList 类似,但它是线程安全的。
  • LinkedList 基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。

ArrayList、LinkedList的区别?

ArrayList:底层是基于数组实现的,查找快,增删较慢。LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
LinkedList:底层是基于链表实现的。确切的说是循环双向链表(JDK1.6之前是双向循环链表、JDK1.7之后取消了循环),查找慢、增删快。LinkedList链表由一系列表项连接而成,一个表项包含3个部分︰元素内容、前驱表和后驱表。因此内存空间占用比ArrayList 更多

ArrayList的初始容量是多少?扩容机制是什么?扩容过程是怎样?

ArrayList在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入数据时默认分配10个对象空间。如果第一次插入的数据超过10,先将ArrayList的容量变为10 之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;当添加第16个数据时,继续扩容变为15 * 1.5 =22个。

Map及其实现类的特点?

  • java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),类似于高中的函数)
    • HashMap:主要实现类;线程不安全的,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
    • LinkedHashMap:是HashMap的子类;在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。 开发中,对于频繁的遍历操作,建议使用此类。
    • TreeMap:底层使用红黑树存储;可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历。需要考虑使用①自然排序 ②定制排序。
    • Hashtable:古老实现类;线程安全的,效率低;不可以添加null的key或value值;底层使用数组+单向链表结构存储(jdk8)
    • Properties:其key和value都是String类型。常用来处理属性文件。

HashMap的底层实现?

数组 + (链表 | 红黑树)

HashMap 基于 Hash 算法实现的

当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
存储时,如果出现hash值相同的key,此时有两种情况。
(1)如果key相同,则覆盖原始值;
(2)如果key不同(出现冲突),则将当前的key-value放入链表中
获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

说说什么是红黑树

根节点是黑色。
节点是黑色或红色。
叶子节点是黑色。
红色节点的子节点都是黑色。
从任意节点到其子节点的所有路径都包含相同数目的黑色节点。
红黑树从根到叶子节点的最长路径不会超过最短路径的2倍。保证了红黑树的高效。

HashMap什么时候会树化?

链表长度超过8且数组容量大于>=64
当链表长度超过树化阈值 8 时,先尝试扩容来减少链表长度,如果数组容量已经 >=64,才会进行树化。

什么时候树会退化?

在扩容时如果拆分树时,树元素个数 <= 6 会退化链表

HashMap 的扩容机制

hashmap在初始化或扩容时,会根据指定或默认的容量找到不小于该容量的2的幂次方,并将其赋值给阈值。然后在第一次调用put方法时,会将阈值赋值给数组长度,并让新的阈值等于数组长度乘以负载因子。
在扩容过程中,hashmap不需要重新计算节点的哈希值,而是根据哈希值最高位判断节点在新数组中的位置,要么在原位置,要么在原长度加上原位置处。
在扩容过程中,hashmap会正序遍历原来的数组,并保持链表中节点的相对顺序不变。
如果某个链表中的节点数超过8个,并且数组长度大于等于64,则会将链表转化为红黑树,提高查找效率。

说说HashMap的put方法执行流程?

将(key,value)添加到当前的map中:
首先,需要调用key1所在类的hashCode()方法,计算key对应的哈希值1,此哈希值经过(hash())算法之后,得到哈希值2。

  • 如果此索引位置i上没有元素,则(key,value)添加成功,并存放到索引i的位置

  • 如果此索引位置i上有元素(key1,value1),则需要继续比较key和key1的哈希值2(哈希冲突)。

    • 如果key的哈希值1和key1的哈希值2不相同,则(key,value)添加成功。
    • 如果key的哈希值1和key1的哈希值2相同 ,则需要比较key和key1的equals()。要调用key所在的equals()方法。
    • 调用equals(),返回false,则(key,value)添加成功;返回true,则替换。
  • 50
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值