Java面试第一山!《集合》!
一、引言
在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于你在日常开发中更加得心应手,还能在面试中脱颖而出。
二、Java 集合框架概述
Java 集合框架主要分为两大体系:Collection
和 Map
。Collection
接口是存储单个元素的集合的根接口,而 Map
接口则是存储键值对的集合的根接口。它们各自有许多不同的实现类,每个实现类都有其独特的特点和适用场景。下面是 Java 集合框架的整体架构图:
三、Collection 体系
(一)List 接口
List
接口是有序的集合,允许存储重复的元素。它的主要实现类有 ArrayList,
LinkedList
和 Vector
。
1. ArrayList
- 特点:基于动态数组实现,支持随机访问,查找元素的效率高,但插入和删除元素的效率相对较低,尤其是在数组中间位置进行操作时。
- 适用场景:适用于需要频繁查找元素,而插入和删除操作较少的场景。
- 示例代码:
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)); // 输出: banana}
}
2. LinkedList
- 特点:基于双向链表实现,插入和删除元素的效率高,尤其是在链表的头部和尾部进行操作时,但随机访问的效率较低。
- 适用场景:适用于需要频繁进行插入和删除操作,而查找操作较少的场景。
- 示例代码:
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");list.addFirst("date");System.out.println(list.get(0)); // 输出: date}
}
3. Vector
- 特点:与
ArrayList
类似,也是基于动态数组实现,但它是线程安全的,不过性能相对较低。 - 适用场景:适用于在多线程环境下需要保证线程安全的场景。
- 示例代码:
import java.util.Vector;
import java.util.List;public class VectorExample {public static void main(String[] args) {List<String> list = new Vector<>();list.add("apple");list.add("banana");list.add("cherry");System.out.println(list.get(1)); // 输出: banana}
}
(二)Set 接口
Set
接口是不允许存储重复元素的集合。它的主要实现类有 HashSet
、TreeSet
和 LinkedHashSet
。
1. HashSet
- 特点:基于哈希表实现,不保证元素的顺序,插入、删除和查找元素的效率都很高。
- 适用场景:适用于需要快速判断元素是否存在,且不关心元素顺序的场景。
- 示例代码:
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("apple"); // 重复元素,不会被添加System.out.println(set.size()); // 输出: 2}
}
2. TreeSet
- 特点:基于红黑树实现,元素会按照自然顺序或者指定的比较器顺序进行排序。
- 适用场景:适用于需要对元素进行排序的场景。
- 示例代码:
import java.util.TreeSet;
import java.util.Set;public class TreeSetExample {public static void main(String[] args) {Set<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);for (Integer num : set) {System.out.print(num + " "); // 输出: 1 2 3}}
}
3. LinkedHashSet
- 特点:基于哈希表和链表实现,既保证了元素的唯一性,又能按照元素插入的顺序进行遍历。
- 适用场景:适用于需要保证元素的插入顺序,同时又需要快速判断元素是否存在的场景。
- 示例代码:
import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetExample {public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.add("apple");set.add("banana");set.add("cherry");for (String fruit : set) {System.out.print(fruit + " "); // 输出: apple banana cherry}}
}
四、Map 体系
Map
接口用于存储键值对,键是唯一的,值可以重复。它的主要实现类有 HashMap
、TreeMap
、LinkedHashMap
和 Hashtable
。
(一)HashMap
- 特点:基于哈希表实现,不保证键值对的顺序,插入、删除和查找元素的效率都很高。
- 适用场景:适用于需要快速查找、插入和删除键值对,且不关心键值对顺序的场景。
- 示例代码:
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);System.out.println(map.get("banana")); // 输出: 2}
}
(二)TreeMap
- 特点:基于红黑树实现,键会按照自然顺序或者指定的比较器顺序进行排序。
- 适用场景:适用于需要对键进行排序的场景。
- 示例代码:
import java.util.TreeMap;
import java.util.Map;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");for (Map.Entry<Integer, String> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());// 输出:// 1: banana// 2: cherry// 3: apple}}
}
(三)LinkedHashMap
- 特点:基于哈希表和链表实现,既保证了键的唯一性,又能按照键的插入顺序或者访问顺序进行遍历。
- 适用场景:适用于需要保证键值对的插入顺序或者访问顺序的场景。
- 示例代码:
import java.util.LinkedHashMap;
import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());// 输出:// apple: 1// banana: 2// cherry: 3}}
}
(四)Hashtable
- 特点:与
HashMap
类似,也是基于哈希表实现,但它是线程安全的,不过性能相对较低。 - 适用场景:适用于在多线程环境下需要保证线程安全的场景。
- 示例代码:
import java.util.Hashtable;
import java.util.Map;public class HashtableExample {public static void main(String[] args) {Map<String, Integer> map = new Hashtable<>();map.put("apple", 1);map.put("banana", 2);System.out.println(map.get("banana")); // 输出: 2}
}
五、常见面试问题及解答
(一)ArrayList 和 LinkedList 的区别
- 数据结构:
ArrayList
基于动态数组实现,LinkedList
基于双向链表实现。 - 随机访问效率:
ArrayList
支持随机访问,效率高;LinkedList
随机访问效率低。 - 插入和删除效率:
ArrayList
在数组中间插入和删除元素效率低;LinkedList
在链表头部和尾部插入和删除元素效率高。
(二)HashMap 和 Hashtable 的区别
- 线程安全性:
HashMap
是非线程安全的,Hashtable
是线程安全的。 - 性能:由于
Hashtable
是线程安全的,所以性能相对较低;HashMap
性能较高。 - 空键和空值:
HashMap
允许键和值为null
,Hashtable
不允许键和值为null
。
(三)Set 和 List 的区别
- 元素唯一性:
Set
不允许存储重复元素,List
允许存储重复元素。 - 元素顺序:
Set
不保证元素的顺序(TreeSet
和LinkedHashSet
除外),List
是有序的集合。
六、总结
掌握 Java 集合框架的知识也是面试中的重要加分项。希望通过这篇博客,你对 Java 集合有了更深入的理解,能够在编程和面试中灵活运用。如果大家在学习过程中有任何疑问,欢迎在评论区留言交流。
翻过这座山,他们就会听到你的故事!
相关文章:
Java面试第一山!《集合》!
一、引言 在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于…...
力扣-二叉树-257 二叉树的所有路径
思路 除去根节点,每一层添加->val,然后使用前序遍历的顺序 代码 class Solution { public:vector<string> res;void getTreePaths(string s, TreeNode* root){s "->";s to_string(root->val);if(root->left nullptr &…...
异构计算架构助力智能座舱实现高效低耗体验
摘要: 随着智能汽车的飞速发展,智能座舱作为人车交互的核心区域,对算力、功耗及延迟等性能指标提出了严苛要求。异构计算架构凭借在硬件、软件与系统层面的深度优化,能显著提升智能座舱的算力利用率,降低功耗与延迟,为用户打造高效、低能耗的智能座舱体验。本文深入剖析…...
【vscode】VScode Remote SSH配置
VScode使用remote ssh 到服务器上的Docker容器中 1. 配置远程服务器docker容器的端口映射,例如将服务器的2222端口映射到container的22端口(默认) 1.1 在容器系统的sshd_config文件中配置参数 #配置文件 vim /etc/ssh/sshd_config #打开端口号 Port 221.2 建立容…...
急停信号的含义
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是确认设备按钮的急停…...
【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快,在几个月之后重新搭建ADB 时发现UC 已经更新了很多,为了后续做ADB 的功…...
MYSQL批量UPDATE的两种方式
工作中遇到批量更新的场景其实是比较常见的。 但是该如何正确的进行批量UPDATE,很多时候往往有点头大。 这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。 如果使用了MyBatis增强组件MyBatisPlus 如果使用了MyBatisPlus,…...
百度宣布:免费!
2月13日,百度大模型文心一言在官网宣布,随着文心大模型的迭代升级和成本不断下降,文心一言将于4月1日起全面免费,所有PC端和APP端用户均可体验文心系列最新模型。 同时,文心一言将上线深度搜索功能,具备更…...
计算机毕业设计SpringBoot+Vue.js医院住院管理系统(源码+lw文档+PPT+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Anaconda +Jupyter Notebook安装(2025最新版)
Anaconda安装(2025最新版) Anaconda简介安装1:下载anaconda安装包2: 安装anaconda3:配置环境变量4:检查是否安装成功5:更改镜像源6:更新包7:检查 Jupyter Notebook一.Jup…...
人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用。飞蛾火焰优化算法(Moth-Flame Optimization, MFO)是一种受自然界中飞蛾向光源趋近行为启发的新型群体智能优化算法。在自然界中&a…...
渗透测试工具:SQLmap安装教程及使用
在渗透测试的世界里,SQL注入攻击无疑是最常见且最具威胁的安全漏洞之一。幸运的是,SQLmap 这个强大的自动化工具,能够帮助我们快速识别和利用这些漏洞。如果你也想了解如何用 SQLmap 进行渗透测试,那么这篇文章就是为你准备的&…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十四节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(CommunicationControl_0x28服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x28服务、通信控制、ISO 14229-1:2023、ECU测试 一、服务功能概述…...
WEB安全--SQL注入--INTO OUTFILE
一、INTO OUTFILE 函数语法: SELECT column1, column2, INTO OUTFILE file_path FROM your_table WHERE your_conditions; 使用此方式在SQL注入的过程中可以: 1、上传shell得到数据库的后端的操作权限 2、爆出数据库的信息 二、使用该函数的条件&#…...
【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言 】C语言 桌游开发数字竞拍(源码…...
开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
工业物联网的机遇与挑战:为什么企业需要Odoo? 《中国智能制造发展研究报告2023》指出,85%的制造企业已启动数字化转型,但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备,而定…...
在分布式场景下可以使用synchronized加锁么?
首先说结论,在分布式系统中,单纯使用 Java 中的 synchronized 关键字是无法满足需求的,下面从 synchronized 的作用原理、在分布式场景下的局限性以及替代方案等方面详细分析。 一、synchronized 的作用原理 在 Java 中,synchron…...
DeepSeek从入门到精通:提示词设计的系统化指南
目录 引言:AIGC时代的核心竞争力 第一部分 基础篇:提示词的本质与核心结构 1.1 什么是提示词? 1.2 提示词的黄金三角结构 第二部分 类型篇:提示词的六大范式 2.1 提示语的本质特征 2.2 提示语的类型 2.2.1 指令型提示词 …...
C# 运算符
总目录 前言 在C#中,运算符是用于执行特定操作的符号。它们可以用于处理变量、常量或其他表达式。C# 提供了丰富的运算符集合,用于执行各种操作,如算术运算、逻辑判断、位操作等。了解这些运算符及其使用方式对于编写高效且功能强大的C#程序…...
duckdb导出Excel和导出CSV速度测试
运行duckdb数据库 D:>duckdb v1.2.0 5f5512b827 Enter “.help” for usage hints. Connected to a transient in-memory database. Use “.open FILENAME” to reopen on a persistent database. 生成模拟数据,10个列,100万行数据; --…...
pt->onnx->rknn(量化) step by step FAQ
文档修订中... 1.pt->onnx 这个转换是在yolov11的docker环境做的转换。非常简单。 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 获取当前脚本文件所在目录的父目录,并构建相对路径 import os import sys current_dir os.path.dirname(os.path.abspath…...
Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer
文章目录 1. 动态规划2. 采样3. 代价函数3.1 障碍物代价3.2 距离终点代价3.3 速度代价3.4 加速度代价3.5 jerk代价 4. 回溯 这一章将来讲解速度决策算法,也就是SPEED_HEURISTIC_OPTIMIZER task里面的内容。Apollo 9.0使用动态规划算法进行速度决策,从类名…...
利用AI智能体创建云端文档知识库并集成第三方数据源(上)
许多开发者在管理和集成多种云端的数据源时经常面对各种各样的困难,所以希望能够构建一个聊天机器人来协调这些数据源,针对业务问题并提供全面的答案。本文介绍了一种解决方案,帮助大家开发一个能够从文档和数据库中回答查询的聊天机器人&…...
Cursor AI开发微信小程序教程
1. 准备工作 在开始开发之前,需要完成以下准备工作: 1.1 安装微信开发者工具 前往微信开发者工具官网下载并安装适合操作系统的开发者工具。注册微信小程序账号,登录微信公众平台(https://mp.weixin.qq.com)&#…...
2025常用的SEO工具有哪些?
在互联网时代,如何让自己的网站或内容脱颖而出,成为许多企业和个人站长们最关注的问题。而在这个过程中,SEO(搜索引擎优化)作为一种有效的提升网站曝光度和吸引流量的手段,已经成为了网站运营的核心之一。对…...
支持直接升级到21c的 Oracle 数据库版本
一、支持直接升级的版本 可以从以下版本直接升级到新版本: • 19c (所有版本) • 18c (所有版本) • 12c Release 2 (12.2) 升级到最新Oracle数据库版本必须采用的路径取决于当前数据库的版本号。 如果当前的Oracle数据库版本早于12.2 版,则无法直接将…...
线程池-抢票系统性能优化
文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …...
回顾Golang的Channel与Select第一篇
深入解析Golang Channel与Select:并发编程的艺术与哲学 一、通信顺序进程(CSP)的Go实现 Go语言创始人Rob Pike将CSP理论具象化为channel原语,实现了"不要通过共享内存来通信,而要通过通信来共享内存"的哲学…...
乐理笔记(持续更新)
单音与音程 单音:由一个音组成。 音程:由两个音组成,表示两个音之间的音高距离。 如何数音程: 单音程:9 - X,性质相反。例如,9度音程减去某个数,性质会相反。 复音程:…...
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 基于AOP的数据字典实现…...
【数据结构入门】一、数组
一、数组的概念 数组:一种由相同类型的数据元素组成的基本数据类型,为引用类型 二、数据的顺序 这里很奇怪,讲了一个寻址函数,就是怎样用坐标求该元素的内存地址。说实话我不知道求这个能干什么,但是感觉还挺好玩的…...
编码格式大全解释以及相关编码特性
目录 说明: 1. Base64 Base64编码的字符集通常包括: Base64的工作原理: Base64编码在安全渗透中的应用场景 常见的Base64编码绕过场景 如何防范Base64绕过攻击 2. URL编码(Percent Encoding) URL编码与安全渗透的关系 示…...
正则表达式(Regular expresssion)
正则表达式 匹配单次 . :匹配任意一个字符 [ ] :匹配[ ]里举例的任意一个字符 /d :匹配数字0-9 /D :匹配非数字 /s :匹配空白或tab建 /S :匹配非空白 /w :…...
JavaScript 发起网络请求 axios、fetch、async / await
目录 fetch 发送 GET 请求(fetch) 发送 POST 请求(fetch) 处理后台异常响应 async / await async await 发送 GET 请求(async / await fetch) 发送 POST 请求(async / await fetch&…...
安装OpenJDK21(linux、macos)
文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神!Java 21正式发布了,迎来了史诗级新特性,堪称版本最强!!! 视频链接:https://www.bilibili.com/video/BV1E8…...
Java面试宝典:说下Spring Bean的生命周期?
Java面试宝典专栏范围:JAVA基础,面向对象编程(OOP),异常处理,集合框架,Java I/O,多线程编程,设计模式,网络编程,框架和工具等全方位面试题详解 每…...
k8s向容器内传文件与下载文件
1、下载: kubectl cp <namespace>/<pod-name>:<container-path> <local-path>示例: kubectl cp mynamespace/mypod:/tmp/testfile.txt ./testfile.txt如果 Pod 中有多个容器,可以通过 -c 标志指定容器: kubectl c…...
A4988一款带转换器和过流保护的 DMOS 微步驱动器的使用方式
A4988是一款带转换器和过流保护的 DMOS 微步驱动器,用于驱动双极步进电动机。它支持全、半、1/4、1/8 及 1/16 步进模式,输出驱动性能可达 35 V 及 2 A。其特点包括简单的步进和方向控制接口、可调电位器调节最大电流输出、自动电流衰减模式检测/选择以及…...
Elasticsearch+Logstash+Kibana可视化集群部署
文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch:开源实时分布式搜索和分析引擎,支持大规模数据存储和高吞吐量,提供丰富的搜索功能和可扩展性。 Logsta…...
数据结构之二叉树
数据结构之二叉树 数据结构之二叉树1. 什么是二叉树?2. 基本概念3. 二叉树的基本形态4. 二叉树的性质5. 特殊二叉树6. 二叉树的存储7. 二叉树的遍历7.1 前序遍历7.2 中序遍历7.3 后序遍历7.4 层次遍历 8. 应用场景9. 实例代码9.1 示例树结构9.2 输出结果 数据结构之…...
华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B
华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 硅基流动 1.1 注册登录 1.2 实名认证 1.3 创建API密钥 1.4 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载: AI聊天本地客户端 接入Chatbox客户端 点击设置 选择SiliconFloW API 粘贴1.3创…...
《图解设计模式》笔记(十)用类来表现
二十二、Command模式:命令也是类 一个类调用某方法,虽然调用结果会反映在对象的状态中,但不会留下工作的历史记录。 若有一个类表示“请进行这项工作”的“命令”,每一项想做的工作就不再是“方法的调用”这种动态处理了,而是一个表示命令的类的实例,即可以用“物”来表…...
Scrapy:任务队列底层设计详解
Scrapy 中队列设计详解 1. 概述 Scrapy 的队列系统是其调度器(Scheduler)的核心组件之一,负责存储和管理待抓取的请求。Scrapy 实现了两种类型的队列: 内存队列:请求存储在内存中,重启后数据丢失磁盘队列…...
zola + github page,用 workflows 部署
之前的Zola都是本地build之后,再push到github上,这种方式很明显的弊端就是只能在本地编辑,而不能通过github编辑,再pull到本地,缺乏了灵活性。因此将zola用workflows来部署。 repo地址:https://github.com/…...
pytest测试专题 - 1.2 如何获得美观的测试报告
<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细,用例在执行调试时还算比较方便阅读和提取失败信息, 但对于大量测试用例运行时,可能会存在以下不足 报文被冲掉测试日志没法归档 …...
关闭浏览器安全dns解决访问速度慢的问题
谷歌浏览器加载速度突然变慢了?检查安全DNS功能(DoH)是否被默认开启。 谷歌浏览器在去年已经推出安全DNS功能(即DoH) , 启用此功能后可以通过加密的DNS增强网络连接安全性。例如查询请求被加密后网络运营商将无法嗅探用户访问的地址,因此对于增强用户的…...
今日AI和商界事件(2025-02-14)
今日AI大事件主要包括以下几个方面: 一、苹果新品预告 事件概述:苹果CEO蒂姆库克在社交媒体发布7秒视频,配文“准备好迎接家庭的新成员”,并宣布2月19日将有新品发布。知名科技记者马克古尔曼称,新款低端iPhone SE将…...
【黑马点评优化】1-使用JWT登录认证+redis实现自动续期
1-使用JWT登录认证redis实现自动续期 0 前言1 原先的redis实现登录鉴权2 JWT登录认证Redis自动续期2.1 认证(identification)授权 (authorization)和鉴权(Authorization)2.1.1 认证(identificat…...
一个让Stable Diffusion更稳定、更易用的Github开源项目
2023除了ChatGPT大火,Stable Diffusion同样也是非常火热,Stable Diffusion是一个Github开源项目,很多爱好者都会本地安装,但面对一些初学者来说,在安装、配置和使用过程中还是会经常出现很多问题,特别不了解…...
Mac之JDK安装
Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统,打开中断命令,输入: uname -a Compressed Archive 是压缩文档,下载的是一个 .tar.gz 压缩包 D…...