Java面试第一山!《集合》!

一、引言

在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于你在日常开发中更加得心应手,还能在面试中脱颖而出。

二、Java 集合框架概述

Java 集合框架主要分为两大体系:Collection 和 MapCollection 接口是存储单个元素的集合的根接口,而 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 接口是不允许存储重复元素的集合。它的主要实现类有 HashSetTreeSet 和 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 接口用于存储键值对,键是唯一的,值可以重复。它的主要实现类有 HashMapTreeMapLinkedHashMap 和 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 允许键和值为 nullHashtable 不允许键和值为 null

(三)Set 和 List 的区别

  • 元素唯一性Set 不允许存储重复元素,List 允许存储重复元素。
  • 元素顺序Set 不保证元素的顺序(TreeSet 和 LinkedHashSet 除外),List 是有序的集合。

六、总结

掌握 Java 集合框架的知识也是面试中的重要加分项。希望通过这篇博客,你对 Java 集合有了更深入的理解,能够在编程和面试中灵活运用。如果大家在学习过程中有任何疑问,欢迎在评论区留言交流。

翻过这座山,他们就会听到你的故事!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18364.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP端弱网模拟与网络测试:如何确保应用在各种网络环境下稳定运行

随着智能手机的普及&#xff0c;APP的网络性能成为用户体验的关键因素之一。尤其是在弱网环境下&#xff0c;应用的表现可能严重影响用户的满意度。因此&#xff0c;APP端的网络测试&#xff0c;尤其是弱网模拟&#xff0c;成为了提升产品质量和用户体验的重要环节。 当前APP网…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…

【Linux】Socket编程—TCP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

分布式技术

一、为什么需要分布式技术&#xff1f; 1. 科学技术的发展推动下 应用和系统架构的变迁&#xff1a;单机单一架构迈向多机分布式架构 2. 数据大爆炸&#xff0c;海量数据处理场景面临问题 二、分布式系统概述 三、分布式、集群 四、负载均衡、故障转移、伸缩性 负载均衡&a…

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程&#xff1a; Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你&#xff1a;deepseek R1基于 AnythingLLM API 调用本地…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…

02、QLExpress从入门到放弃,相关API和文档

QLExpress从入门到放弃,相关API和文档 一、属性开关 public class ExpressRunner {private boolean isTrace;private boolean isShortCircuit;private boolean isPrecise; }/*** 是否需要高精度计算*/ private boolean isPrecise false;高精度计算在会计财务中非常重要&…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

CCF-GESP 等级考试 2024年9月认证C++二级真题解析

2024年9月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;A 考察知识点&#xff1a;计算机存储 解析&#xff1a;磁心存储元件是早期计算机中用于存储数据的部件&#xff0c;它和现代计算机中的内存功能类似&#xff0c;都是用于临时…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

京东 旋转验证码 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 使用的第三方接码平台识别…

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…

Unity中自定义协程的简单实现

在 Unity 中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种非常强大的工具&#xff0c;它允许我们在不阻塞主线程的情况下&#xff0c;将代码的执行分成多个步骤&#xff0c;在不同的帧中执行。 Unity中协程实现原理 迭代器与状态机&#xff1a;本质上是基于C#的迭…

数值积分:通过复合梯形法计算

在物理学和工程学中&#xff0c;很多问题都可以通过数值积分来求解&#xff0c;特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中&#xff0c;我将讨论如何使用 复合梯形法 来进行数值积分&#xff0c;并以一个简单的…

【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 &#x1f3e0; yum &#x1f3b8; 什么是yum 当用户想下载软…

DeepSeek教unity------MessagePack-02

内置支持类型&#xff1a; 对象序列化 MessagePack for C# 可以序列化你自己定义的公共类或结构体类型。默认情况下&#xff0c;可序列化的类型必须用 [MessagePackObject] 属性进行注解&#xff0c;成员需要用 [Key] 属性进行注解。键可以是索引&#xff08;整数&#xff09;…

deepseek部署在本地详细教程

最近&#xff0c;DeepSeek爆火&#xff0c;先进的算法、卓越的能力&#xff0c;表现出众&#xff0c;其凭一己之力推动国内Ai大模型跨越式发展。作为一款现象级的Ai产品&#xff0c;用户量暴增&#xff0c;最近服务器又被攻击&#xff0c;使用DeepSeek&#xff0c;经常出现服务…

修改OnlyOffice编辑器默认字体

通过Docker修改OnlyOffice编辑器默认字体 问题描述详细方案1. 删除原生字体文件2. 创建字体目录3. 复制字体文件到容器中4. 执行字体更新脚本5. 重新启动容器 注意事项 问题描述 在OnlyOffice中&#xff0c;编辑器的默认字体可能不符合公司或个人的需求&#xff0c;通常会使用…