【Java面试题02】Java 集合常见面试题
文章目录
- 一、前言🚀🚀🚀
- 二、Java 基础面试题:☀️☀️☀️
- 1、说说 Java 中 HashMap 的原理?
- 2、HashMap 的扩容机制?
- 3、为什么 Java 中 HashMap 的默认负载因子是 0.75?
- 4、JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?
- 5、Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
- 6、数组和链表在 Java 中的区别是什么?
- 后序还在更新中~~~
- 三、总结:🍓🍓🍓
一、前言🚀🚀🚀
☀️
你每一天的努力会在未来的某一个点交汇成宏伟的画面。
本文简介:本人是大二软件工程专业,java后端方向,学习路线:java基础->JDBC->Maven->MyBatis->SSM,通过做笔记分享到博客上的形式,激励自己学习,同时方便复习。由于水平为入门级别,如有错误,希望大佬们评论或私信斧正 Thanks♪(・ω・))ノ
二、Java 基础面试题:☀️☀️☀️
1、说说 Java 中 HashMap 的原理?
HashMap 是基于哈希表的数据结构,用于存储键值对(key-value)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表(在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。
HashMap 使用键的 hashCode() 方法计算哈希值,并通过 indexFor 方法(JDK 1.7 及之后版本移除了这个方法,直接使用 (n - 1) & hash)确定元素在数组中的存储位置。哈希值是经过一定扰动处理的,防止哈希值分布不均匀,从而减少冲突。
HashMap 的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,容量x2并重新分配元素位置。这种扩容是比较耗时的操作,频繁扩容会影响性能。
2、HashMap 的扩容机制?
HashMap 的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,容量x2并重新分配元素位置。
扩容时,Hashmap需要重新计算所有元素的哈希值,并将它们重新分配到新的哈希桶中,这个过程称为rehashing。每个元素的存储位置会根据新容量的大小重新计算哈希值,并移动到新的数组中。
这种扩容是比较耗时的操作,频繁扩容会影响性能。
3、为什么 Java 中 HashMap 的默认负载因子是 0.75?
是为了在时间复杂度和空间复杂度之间取得一个合理的平衡,负载因子为 0.75 时,避免过多扩容的同时,也保证了不会出现过多的哈希冲突,
确保查找和插入操作的效率,维持良好的性能表现。
4、JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?
改进了哈希函数的计算:JDK 1.8 中优化了哈希函数,使得哈希值的分布更加均匀,减少了哈希冲突的发生,通过在生成哈希值时使用“扰动函数”,确保哈希值的高低位都能参与到桶的选择中。
扩容机制优化:JDK 1.8 改进了扩容时的元素迁移机制。在扩容过程中不再对每个元素重新计算哈希值,而是根据原数组长度的高位来判断元素是留在原位置,还是迁移到新数组中的新位置。这一改动减少了不必要的计算,提升了扩容效率。
头插法变为尾插法:头插法的好处就是插入的时候不需要遍历链表,直接替换成头结点,但是缺点是扩容的时候会逆序,而逆序在多线程操作下可能会出现环,产生死循环,于是改为尾插法。
5、Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
JDK 1.7 ConcurrentHashMap 采用的是分段锁,即每个 Segment 是独立的,可以并发访问不同的 Segment,默认是 16 个 Segment,所以最多有 16 个线程可以并发执行。
而 JDK 1.8 移除了 Segment,锁的粒度变得更加细化,锁只在链表或红黑树的节点级别上进行。通过 CAS 进行插入操作,只有在更新链表或红黑树时才使用 synchronized,并且只锁住链表或树的头节点,进一步减少了锁的竞争,并发度大大增加。
并且 JDK 1.7 ConcurrentHashMap 只使用了数组 + 链表的结构,而 JDK 1.8 和 HashMap一样引入了红黑树。
除此之外,还有扩容的区别以及 size 方法的计算也不一样。
6、数组和链表在 Java 中的区别是什么?
1、数组是内存中连续的空间,而链表可以不连续
2、数组长度固定,如果需要扩展数组,需要重新开辟一片空间使用。而链表可以直接用指针指向不同的地址,扩展方便。
3、在读取多的场景下适合用数组,数组可以直接用下标访问,而在插入和删除操作多的场景下适合用链表4、链表需要额外的空间存储指针,占用的空间会比数组更多。
后序还在更新中~~~
三、总结:🍓🍓🍓
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。