深入解析Java集合框架:春招面试要点
在上一篇文章中,我们深入探讨了Java核心基础,这是学习Java的基石。而在实际的Java开发中,集合框架的使用频率极高,它为我们提供了丰富的数据结构和算法实现,极大地提高了开发效率。对于春招面试来说,集合框架也是重点考察内容之一。接下来,让我们一同深入解析Java集合框架。
一、集合框架概述
Java集合框架主要包含Collection和Map两大接口体系。Collection接口又衍生出List、Set和Queue等子接口,每个子接口都有不同的实现类,如ArrayList、LinkedList、HashSet、TreeSet、PriorityQueue等;Map接口用于存储键值对,常见的实现类有HashMap、TreeMap、ConcurrentHashMap等。这些集合类在不同的场景下有着各自的优势,开发人员需要根据具体需求选择合适的集合。
二、List接口及实现类
ArrayList
ArrayList是基于数组实现的List,它允许元素重复,并且有序(插入顺序)。由于基于数组,ArrayList支持快速的随机访问,时间复杂度为O(1),即可以通过索引快速定位到元素。但在进行插入和删除操作时,尤其是在列表中间位置进行操作时,需要移动大量元素,时间复杂度为O(n)。例如:
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("cherry");System.out.println("获取第二个元素: " + list.get(1));list.add(1, "date");System.out.println("插入元素后的列表: " + list);list.remove(2);System.out.println("删除元素后的列表: " + list);}
}
在实际应用中,当需要频繁进行随机访问操作,而插入和删除操作较少时,ArrayList是一个不错的选择,比如数据库查询结果的存储。
LinkedList
LinkedList是基于双向链表实现的List,同样允许元素重复且有序。与ArrayList不同,LinkedList的插入和删除操作在除首尾位置外,不需要移动大量元素,时间复杂度为O(1);但随机访问时,需要从头或尾开始遍历链表,时间复杂度为O(n)。例如:
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("apple");list.add("banana");list.add("cherry");System.out.println("获取第二个元素: " + list.get(1));list.add(1, "date");System.out.println("插入元素后的列表: " + list);list.remove(2);System.out.println("删除元素后的列表: " + list);}
}
如果应用场景中插入和删除操作频繁,而随机访问操作较少,如实现一个简单的任务队列,LinkedList会更合适。
面试题1:ArrayList和LinkedList的区别及使用场景
答案:
- 区别:
-
- 数据结构:ArrayList基于数组,LinkedList基于双向链表。
-
- 随机访问:ArrayList支持快速随机访问,时间复杂度为O(1);LinkedList随机访问慢,时间复杂度为O(n)。
-
- 插入和删除:ArrayList在中间位置插入和删除元素时,需要移动大量元素,时间复杂度为O(n);LinkedList在中间位置插入和删除元素时,时间复杂度为O(1),但在获取元素时需要遍历链表。
- 使用场景:
-
- ArrayList:适用于需要频繁随机访问,插入和删除操作较少的场景,如数据库查询结果的存储。
-
- LinkedList:适用于插入和删除操作频繁,随机访问操作较少的场景,如实现任务队列。
三、Set接口及实现类
HashSet
HashSet是基于HashMap实现的Set,它不允许元素重复,并且元素是无序的。HashSet通过计算元素的哈希值来确定元素在集合中的存储位置,从而实现快速的添加、删除和查找操作,平均时间复杂度为O(1)。例如:
import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("apple");set.add("banana");set.add("cherry");set.add("apple");System.out.println("集合中的元素: " + set);System.out.println("是否包含banana: " + set.contains("banana"));set.remove("cherry");System.out.println("删除元素后的集合: " + set);}
}
在需要快速判断元素是否存在,且不关心元素顺序的场景下,如统计网站访问用户的IP地址,HashSet非常适用。
TreeSet
TreeSet是基于红黑树实现的Set,它同样不允许元素重复,但元素是有序的(自然顺序或自定义顺序)。TreeSet的添加、删除和查找操作的时间复杂度为O(log n),因为红黑树是一种自平衡的二叉搜索树。例如:
import java.util.Set;
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {Set<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println("集合中的元素: " + set);System.out.println("是否包含2: " + set.contains(2));set.remove(1);System.out.println("删除元素后的集合: " + set);}
}
当需要对元素进行排序,并且快速查找元素时,TreeSet是很好的选择,比如存储学生成绩并按成绩排序。
面试题2:HashSet和TreeSet的区别及使用场景
答案:
- 区别:
-
- 数据结构:HashSet基于HashMap,TreeSet基于红黑树。
-
- 元素顺序:HashSet元素无序,TreeSet元素有序(自然顺序或自定义顺序)。
-
- 时间复杂度:HashSet的添加、删除和查找操作平均时间复杂度为O(1);TreeSet的添加、删除和查找操作时间复杂度为O(log n)。
- 使用场景:
-
- HashSet:适用于需要快速判断元素是否存在,且不关心元素顺序的场景。
-
- TreeSet:适用于需要对元素进行排序,并且快速查找元素的场景。
四、Map接口及实现类
HashMap
HashMap是基于哈希表实现的Map,它存储键值对,允许键为null(最多一个),值也可以为null。HashMap通过计算键的哈希值来确定键值对的存储位置,从而实现快速的插入、删除和查找操作,平均时间复杂度为O(1)。但在哈希冲突严重时,性能会下降。例如:
import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println("获取banana的值: " + map.get("banana"));map.put("apple", 4);System.out.println("更新后的map: " + map);map.remove("cherry");System.out.println("删除元素后的map: " + map);}
}
在需要快速根据键获取值的场景下,如用户信息的存储,使用用户名作为键,用户详细信息作为值,HashMap是常用的选择。
TreeMap
TreeMap是基于红黑树实现的Map,它同样存储键值对,但键是有序的(自然顺序或自定义顺序)。TreeMap的插入、删除和查找操作的时间复杂度为O(log n)。例如:
import java.util.Map;
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {Map<Integer, String> map = new TreeMap<>();map.put(3, "apple");map.put(1, "banana");map.put(2, "cherry");System.out.println("获取键为2的值: " + map.get(2));map.put(1, "date");System.out.println("更新后的map: " + map);map.remove(3);System.out.println("删除元素后的map: " + map);}
}
当需要按键的顺序遍历键值对,或者根据键的范围进行查找时,TreeMap比较合适,比如存储股票价格按时间顺序排序。
ConcurrentHashMap
ConcurrentHashMap是线程安全的HashMap,在多线程环境下具有更好的性能。它采用分段锁机制,允许多个线程同时访问不同的段,从而提高并发性能。在JDK 8之后,ConcurrentHashMap引入了红黑树来优化哈希冲突时的性能。例如:
import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println("获取banana的值: " + map.get("banana"));map.put("apple", 4);System.out.println("更新后的map: " + map);map.remove("cherry");System.out.println("删除元素后的map: " + map);}
}
在多线程环境下,当需要一个线程安全的Map时,ConcurrentHashMap是首选,比如在多线程的缓存系统中。
面试题3:HashMap和ConcurrentHashMap的区别及使用场景
答案:
- 区别:
-
- 线程安全性:HashMap是非线程安全的,ConcurrentHashMap是线程安全的。
-
- 实现方式:HashMap基于哈希表,采用链表(JDK 8后引入红黑树处理哈希冲突);ConcurrentHashMap在JDK 7及之前采用分段锁机制,JDK 8之后采用CAS操作和内置锁,并且引入红黑树优化性能。
-
- 性能:在单线程环境下,HashMap性能更好;在多线程环境下,ConcurrentHashMap通过分段锁等机制,允许多个线程同时操作不同部分,性能更优。
- 使用场景:
-
- HashMap:适用于单线程环境下,需要快速根据键获取值的场景。
-
- ConcurrentHashMap:适用于多线程环境下,需要线程安全的Map,并且对性能有较高要求的场景。
掌握Java集合框架的原理和使用,对于春招面试和实际开发都至关重要。下一篇,我们将聚焦于Java多线程与并发相关知识,继续为你的春招面试助力。
相关文章:
深入解析Java集合框架:春招面试要点
在上一篇文章中,我们深入探讨了Java核心基础,这是学习Java的基石。而在实际的Java开发中,集合框架的使用频率极高,它为我们提供了丰富的数据结构和算法实现,极大地提高了开发效率。对于春招面试来说,集合框…...
【Elasticsearch】Elasticsearch的查询
Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...
STM32 PWM驱动直流电机
接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…...
系统思考—心智模式
“我们的大脑对连贯性的渴望远胜于对准确性的追求。”—诺贝尔经济学得主丹尼尔卡尼曼 在面对复杂的决策时,我们往往更倾向于寻找那些能够迅速串联起来的信息,而非深入挖掘每一个细节的真实性。这种倾向在日常生活中或许能帮助我们迅速作出决策…...
JavaScript_02 表单
表单常用演示: 1.图片 结果失真了... 2.切换图片 切换结果 3.表单:...
【Qt】06-对话框
对话框 前言一、模态和非模态对话框1.1 概念1.2 模态对话框1.2.1 代码QAction类 1.2.2 模态对话框运行分析 1.3 非模态对话框1.3.1 代码局部变量和成员变量setAttribute 类 1.3.2 现象解释 二、标准对话框2.1 提示对话框 QMessageBox2.1.1 现象及解释 2.2 问题对话框2.2.1 现象…...
AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...
2.策略模式(Strategy)
定义 定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。该模式使算法可独立于使用它的客户程序(稳定)而变化(拓展,子类化)。 动机(Motiva…...
Python里的小整数问题挺有意思的
简单来说,Python为了优化性能,会把一些常用的整数(通常是-5到256)提前创建好,放到一个“缓存池”里。这样,当你用到这些小整数时,Python就不用每次都重新创建对象了,直接从缓存池里拿…...
开源智慧园区管理系统对比五款主流产品探索智能运营新模式
内容概要 在这个数字化迅速发展的时代,园区管理也迎来了全新的机遇和挑战。众所周知,开源智慧园区管理系统作为一种创新解决方案,正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整,也为用户提供…...
正则表达式入门
入门 1、提取文章中所有的英文单词 //1.先创建一个Pattern对象,模式对象,可以理解成就是一个正则表达式对象 Pattern pattern Pattern.compile("[a-zA-Z]"); //2.创建一个匹配器对象 //理解:就是 matcher匹配器按照p…...
hive:数据导入,数据导出,加载数据到Hive,复制表结构
hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具,主要用于批处理和大数据分析,而不是为OLTP(在线事务处理)操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…...
【某大厂一面】HashSet底层怎么实现的
HashSet 是 Java 集合框架中的一个非常常用的集合类,它实现了 Set 接口,并且底层通常是通过 哈希表(HashMap)来实现的。要理解 HashSet 的底层实现,我们需要从哈希表的工作原理开始讲起。下面是对 HashSet 底层实现的详…...
动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践
利用图神经网络进行节点分类:从理论到实践 前言 在之前的学习中,大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络(GNNs)来解决节点分类问题。在节点分类任务里,大家往往仅掌握少量节点的真实标签,却要推断出其余所有节点的标签,这属于归纳式学…...
免杀国内主流杀软的恶意样本分析
目录下存在愤怒的小鸟.exe和fun.dll文件,最新版火绒,windows defender,腾讯电脑管家,360静态扫描都未发现恶意程序 动态执行,杀软也未拦截 上传到virustotal网站分析恶意程序,只有三个引擎检测出来 die分析…...
第4章 基于中点电流的NPC逆变器中点电压平衡策略
1. 工作原理 1.1 NPC型三电平逆变器工作原理 NPC型三相三电平逆变器有A、B、C三个桥臂,其组成结构是相同的,本章以A相为例,对其工作原理进行分析。开关器件SA1和SA3、SA2和SA4为互补器件,通过控制开关器件的导通和关断状态&#…...
消息队列篇--通信协议篇--应用层协议和传输层协议理解
在网络通信中,传输层协议和应用层协议是OSI模型中的两个不同层次的协议,它们各自承担着不同的职责。 下文中,我们以TCP/UDP(传输层协议)和HTTP/SMTP(应用层协议)为例进行详细解释。 1、传输层协…...
FLTK - FLTK1.4.1 - demo - animgifimage
文章目录 FLTK - FLTK1.4.1 - demo - animgifimage概述笔记END FLTK - FLTK1.4.1 - demo - animgifimage 概述 知识点: 注册图像文件类型判断回调 FLTK支持的图像格式 GIF, BMP, ICO, PNM, PNG, jpg, svg 事件回调的注册 GIF图像显示为图片或动画的标志设置 // 超时回调的设置…...
目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek
以下是目前市场主流AI PC对**大模型本地部署支持情况**的综合分析,结合硬件能力、软件生态及厂商动态进行总结: --- ### **一、硬件配置与算力支持** 1. **核心处理器架构** - **异构计算方案(CPUGPUNPU)**:主流…...
1.2 基于深度学习的底层视觉技术
文章目录 高层视觉任务与底层视觉任务深度神经网络相对于传统方法的优势 高层视觉任务与底层视觉任务 计算机视觉中的任务包含高层视觉任务,底层视觉任务。高层视觉任务是处理语义级别相关的任务,例如图像分类、目标检测、图像分割等。底层视觉任务处理与…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
