news 2026/6/9 22:34:16

【面试八股|Java集合】Java集合常考面试题详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【面试八股|Java集合】Java集合常考面试题详解

这里根据个人说话口吻等编写java集合常见面试题用于记录复习,后续会持续更新补充。

JAVA集合

该部分内容有几大考察要点:1.底层源码 2.不同集合之间的对比特点

1.底层源码如果是宽泛的问(如ArrayList的底层原理是什么),需要分别从底层数据结构,核心方法讲解

2.不同集合对比,主要牢记不同集合的特点,主要考虑线程安全,底层数据结构等,再组织语言回答。

JAVA提供的常见集合(JAVA集合概述)

java提供了两大类集合框架-第一类是Collection 属于单列集合,第二类为Map 属于双列集合。Collection有三个子接口,分别为Set,List,Queue。像我们常用的HashSet,TreeSet,ArrayList,PriorityQueue等等都属于该框架。Map为双列集合,比较常见的实现类有HashMap,TreeMap,ConcurrentHashMap等。

ArrayList的底层原理

ArrayList的实现原理

ArrayList的底层数据结构是由一个动态数组实现的。这里具体说明一下add方法的底层原理。

第一,会先确保当前数组长度size+1后足够存下一个元素,如果不够将进行扩容。在扩容逻辑中,会调用grow方法将容量扩容到原来的1.5倍。

第二,在确保新增数据有地方存储之后,会将新元素添加到位于size的位置上。

最后,在添加成功会返回布尔值。

ArrayList的成员变量

DEFAULT_CAPACITY= 10; 默认初始的容量**(CAPACITY)

EMPTY_ELEMENTDATA= {}; 用于空实例的共享空数组实例

DEFAULTCAPACITY_EMPTY_ELEMENTDATA= {};用于默认大小的空实例的共享空数组实例

Object[] elementData; 存储元素的数组缓冲区

int size; ArrayList的大小(它包含的元素数量)

ArrayList的构造方法

第一种无参构造器:会将elementData赋值为空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA,此时数组容量为0,只有在第一次调用add方法才会懒加载首次扩容为10

第二种有参构造器:如果传入参数initialCapactity=0,则赋值为空数组。如果传入参数initialCapactity>0则创建长度为initialCapactity的数组。如果传入参数initialCapactity<0,则抛出异常illegalArgumentException

第三种为传入集合构造器,会将集合转为数组,赋值给elementData,数组容量为集合的size。

HashMap的底层原理

HashMap的实现原理

第一,hashmap底层使用hash表数据结构,即数组和链表或红黑树。

第二,在增添元素时,计算key的哈希值确定元素下标。如果出现hash值相同则有两种情况:一是key相同,那就覆盖原始值。二是key不同,出现哈希冲突,那就将当前key-value存入链表或红黑树。

第三,在获取元素时,也计算key的hash值找到对应下标,再进一步判断key是否相同,从而找到对应值。

HashMap的成员变量

1.默认初始容量

2.默认加载因子

3.存储元素的hashmap.node<k,v> []table

4.包含元素数量size

HashMap的put方法原理

第一,先判断键值对table是否为null或空,如果是则通过resize()扩容

第二,根据key计算hash值确定元素下标,如果对应下标为空,则直接添加元素。

第三,对应下标不为空,先判断首个元素是否key相同,如果相同则覆盖value

第四,如果key不相同,则判断当前table[i]是否为红黑树,如果是红黑树则插入键值对。

第五,如果不是红黑树,则遍历table[i],在尾部插入元素。当然在遍历过程如果发现key相同,则直接覆盖value

第六,在插入元素后检测是否需要转换红黑树(链表长度大于8并且数组长度大于64)或扩容(扩容阈值=数组容量*扩容因子)。

HashMap的扩容机制

第一,在添加元素或初始化时可能会调用resize方法进行扩容。在添加元素时达到了扩容阈值=0.75*数组长度会发生扩容。

第二,第一次添加元素初始化数组长度为16,之后每次扩容都是扩容到原来元素的二倍。

第三,具体扩容逻辑,在扩容时会创建一个新数组,并把老数组元素挪动到新数组中。这里分出三种情况:

1.没有hash冲突的节点,直接使用 e.hash & (newCap - 1) 在新数组中的元素下标

2.有哈希冲突,如果是链表则判断e.hash&oldCap是否为0。如果是,新数组元素下标与旧数组元素下标相同;如果不是,新数组元素下标=旧数组元素下标+旧数组容量

3.如果是红黑树,则走红黑树逻辑的添加。

HashMap的寻址算法

第一,通过两次hash计算hash值。先计算key的hashcode,再右移16位与原本的hashcode异或运算,来使hash值更均匀减少hash冲突

第二,使用hash&(n-1)代替取模,得到数组得到索引。也因此数组长度必须是2的n次幂。

为什么HashMap的数组长度一定是2的次幂?

第一,计算索引,用位运算替代取模运算,更高效

第二,在扩容时,通过hash&oldcap计算元素是否留在原来位置,更高效。

HashMap在1.7情况下的多线程死循环

第一,在jdk1.7时的数据结构为数组+链表

第二,在jdk1.7时使用头插法,在进行扩容数据迁移时可能导致死循环。

第三,举例,现有两个线程,线程一读取到当前hashmap,并准备扩容时,线程二介入。线程二读取hashmap直接扩容,将原本链表的AB顺序扩容后变成了BA,线程二结束。线程一再执行就会发生死循环,导致BAB。

第四,jdk8对扩容算法做出调整,采用了尾插法避免死循环。

ArrayList与Vector的区别

1.ArrayList与Vector都是List的实现类,ArrayList被主要使用,而Vector更古老

2.两底层都使用object[],ArrayList线程不安全,Vector线程安全

ArrayList与LinkedList的区别

1.线程是否安全:两个都不线程安全

2.数据结构:ArrayList底层采用数组,LinkedList底层采用双向链表(jdk1.7取消循环)

3.操作数据:ArrayList支持按照下标查询,LinkedList不支持下标查询。查找未知索引两个都需要遍历,时间复杂度都是O(n)。增删在头尾节点为O(1),其它情况ArrayLits需要挪动数组,LinkedLIst需要遍历,都是O(n)。

4.内存空间占用,ArrayList底层是数组,内存连续,节省空间。LinkedList,还需要存两个指针,更占用内存。

HashMap与HashSet的区别

1.底层数据结构,HashSet底层使用HashMap进行存储。知识HashSet的value默认Object对象

2.HashSet实现的是Set接口,存储对象;HashMap实现Map接口,存储键值对。

HashMap与HashTable的区别

1.底层数据结构:HashMap是数组+链表+红黑树。HashTable是数组+链表

2.线程是否安全:HashMap不安全,HashTable安全(synchronized),粒度粗效率低下。

3.扩容机制:HashMap是容量翻倍,HashTable是翻倍+1

4.是否可为null:HashMap能为null,HashTable不能为null

5.hash算法:HashMap是二次hash,HashTable是hashCode()

简单介绍ConcurrentHashMap

数据结构:在1.8之前使用分段数组+链表(segment默认16+hashentry),1.8时采用数据+链表+红黑树

线程安全:1.8之前对segment数组加锁,继承reentrantlock,粒度粗。1.8时对Node加锁,采用CAS+synchronzied

并发度:1.8之前并发度为segment的个数,为16。1.8后为Node个数,并非度高。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 17:11:16

OB 之 PAM

PAM 是什么&#xff1f;&#xff08;你以后一定会遇到&#xff09; 1️⃣ PAM 的全称 PAM Pluggable Authentication Modules 是 Linux 统一认证框架。 2️⃣ 在 OpenBMC 里&#xff0c;PAM 干什么&#xff1f; 所有“登录 / 认证”几乎都会经过 PAM&#xff1a; 场景是否经…

作者头像 李华
网站建设 2026/6/6 22:20:09

18-iptables防火墙

一、iptables防火墙 1、语法格式 iptables -t 表名 [选项] 链名 [条件1] [条件2]... -j [策略] 表名nat 包过滤filter 地址转换 链名PREROUTING 路由前&#xff0c;改目的 IPINPUT 入站FORWORD 专门处理经过本机转发的流量&#xff08;即不是发给本机&#xff0c;也不是从本…

作者头像 李华
网站建设 2026/6/6 13:47:19

基于Java和Html的在线考试管理系统开题报告

目录 系统背景与意义技术选型功能模块设计系统特色开发计划预期成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 系统背景与意义 在线考试管理系统通过数字化手段替代传统纸质考试&#xff0c;提升效…

作者头像 李华
网站建设 2026/6/6 5:49:21

利用Daraz API获取商品详情数据

Daraz作为东南亚领先的电商平台&#xff0c;提供了丰富的API接口供开发者集成。获取商品详情数据是其核心功能之一&#xff0c;可用于价格监控、库存管理、数据分析等场景。本文将介绍如何调用Daraz的商品详情API接口。 1. API基础信息 接口类型&#xff1a;RESTful请求方法&…

作者头像 李华
网站建设 2026/6/9 21:25:28

Web3娱乐的“三角密码”:2026年哈希竞猜破局的三把钥匙

引言&#xff1a;当哈希算法遇上万亿级娱乐市场2026年&#xff0c;全球Web3娱乐市场正经历一场静默革命。从比特币矿工的“区块哈希竞猜”到链游平台的“幸运哈希抽奖”&#xff0c;从去中心化赌场的“平倍牛牛”到社交平台的“单双数预测”&#xff0c;哈希算法已从密码学工具…

作者头像 李华
网站建设 2026/6/9 21:07:06

2026年行业盘点:这五家背涂胶工厂凭何跻身TOP榜单?

朋友们&#xff0c;最近家里装修&#xff0c;是不是被“瓷砖空鼓”、“脱落”这些词搞得头大&#xff1f;选背涂胶&#xff0c;就跟选对象一样&#xff0c;看着都差不多&#xff0c;用起来才知道谁是真靠谱。今天&#xff0c;咱们不聊虚的&#xff0c;就用数据和故事&#xff0…

作者头像 李华