Java 集合框架 (java.util 包) 是 Java 中用于存储和操作数据集合的核心组件,其设计精良、功能强大且高度灵活。理解其体系结构是 Java 进阶的关键一步。

一.集合的核心思想

接口与实现分离

        集合框架的核心在于接口定义了行为规范,而具体实现类提供了不同的底层数据结构和算法。应用程序应该面向0接口编程,这样可以在不改变代码逻辑的情况下更换实现,提高灵活性和可维护性。

集合框架的总体结构

Java 集合框架主要分为两大分支:Collection 和 Map

  • Collection 接口:是单列集合的根接口,用于存储单个元素。它有三个主要的子接口:ListSet 和 Queue
  • Map 接口:是双列集合的根接口,用于存储键值对。

二.Collection接口 -- 单列集合

        Collection是单列集合的祖宗接口,它的功能是全部的单列集合都可以继承使用的,下图是Collection接口下的继承和实现关系。

List系列集合:添加的元素是有序,可重复,有索引

Set系列集合:添加的元素是无序,不重复,无索引

Collection中的方法:

1. 基本操作方法

方法描述返回值示例
boolean add(E e)添加元素成功返回 truelist.add("Java")
boolean remove(Object o)删除指定元素存在并删除返回 trueset.remove("Python")
int size()返回元素数量集合大小queue.size()
boolean isEmpty()检查是否为空空集合返回 trueif (coll.isEmpty())
void clear()清空集合list.clear()

2. 批量操作方法

方法描述示例
boolean addAll(Collection<? extends E> c)添加另一个集合的所有元素list1.addAll(list2)
boolean removeAll(Collection<?> c)删除指定集合中存在的所有元素set.removeAll(subset)
boolean retainAll(Collection<?> c)仅保留指定集合中的元素(求交集)list.retainAll(subList)
boolean containsAll(Collection<?> c)检查是否包含指定集合的所有元素if (set.containsAll(subset))

3. 查询方法

方法描述示例
boolean contains(Object o)检查是否包含指定元素if (list.contains("Java"))
Object[] toArray()将集合转为数组Object[] arr = coll.toArray()
<T> T[] toArray(T[] a)将集合转为指定类型数组String[] arr = list.toArray(new String[0])

4. 迭代方法

方法描述示例
Iterator<E> iterator()返回迭代器Iterator<String> it = coll.iterator()
default void forEach(Consumer<? super T> action)使用函数式接口遍历list.forEach(System.out::println)

5. Java 8 新增默认方法

方法描述示例
default boolean removeIf(Predicate<? super E> filter)删除满足条件的元素list.removeIf(s -> s.length() < 3)
default Spliterator<E> spliterator()返回可分割迭代器Spliterator<String> sp = coll.spliterator()
default Stream<E> stream()返回顺序流coll.stream().filter(...)
default Stream<E> parallelStream()返回并行流coll.parallelStream().
import java.util.*;public class CollectionDemo {public static void main(String[] args) {// 1. 创建集合 (使用ArrayList实现)Collection<String> languages = new ArrayList<>();// 2. 添加元素languages.add("Java");languages.add("Python");languages.add("JavaScript");languages.add("C++");System.out.println("初始集合: " + languages); // [Java, Python, JavaScript, C++]// 3. 检查元素是否存在System.out.println("包含Java? " + languages.contains("Java")); // true// 4. 删除元素languages.remove("C++");System.out.println("删除C++后: " + languages); // [Java, Python, JavaScript]// 5. 批量操作 - 添加另一个集合Collection<String> frontend = new HashSet<>();frontend.add("HTML");frontend.add("CSS");frontend.add("JavaScript");languages.addAll(frontend);System.out.println("添加前端技术后: " + languages); // [Java, Python, JavaScript, HTML, CSS]// 6. 批量操作 - 删除另一个集合中的元素languages.removeAll(frontend);System.out.println("移除前端技术后: " + languages); // [Java, Python]// 7. 批量操作 - 保留交集Collection<String> popular = List.of("Java", "Python", "Go");languages.retainAll(popular);System.out.println("保留流行语言后: " + languages); // [Java, Python]// 8. 转换为数组Object[] array = languages.toArray();System.out.println("数组内容: " + Arrays.toString(array)); // [Java, Python]// 9. 遍历集合 - 迭代器System.out.print("迭代器遍历: ");Iterator<String> it = languages.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println(); // 迭代器遍历: Java Python // 10. 遍历集合 - forEach (Java 8+)System.out.print("forEach遍历: ");languages.forEach(lang -> System.out.print(lang + " "));System.out.println(); // forEach遍历: Java Python // 11. Java 8 新特性 - removeIflanguages.removeIf(lang -> lang.startsWith("P"));System.out.println("移除P开头的语言后: " + languages); // [Java]// 12. Java 8 新特性 - streamlong count = languages.stream().filter(lang -> lang.length() > 3).count();System.out.println("长度大于3的元素数量: " + count); // 1 (Java)// 13. 清空集合languages.clear();System.out.println("清空后集合: " + languages); // []System.out.println("集合是否为空? " + languages.isEmpty()); // true}
}

三.Map 接口 -- 双列集合

1. “双列集合”的含义

“双列”: 指的是 Map 存储的元素由两个部分组成:

  • 键 (Key): 用于唯一标识元素的部分,相当于第一列。
  • 值 (Value): 与键相关联的数据部分,相当于第二列。

“集合”: 指的是 Map 本身是一个容器,用于存储和管理这些键值对 (Key-Value Pair) 元素。

2. Map 接口的核心概念

键值对 (Key-Value Pair): 这是 Map 存储的基本单位。每个元素都是一个包含 Key 和 Value 的配对。

键 (Key) 的唯一性: Map 中 不允许有重复的键。每个键最多只能映射到一个值。这是 Map 最重要的特性之一。

值 (Value) 的可重复性: 不同的键可以映射到相同的值。值可以重复。

映射关系 (Mapping): Map 的核心功能就是建立 Key 到 Value 的映射关系。通过一个 Key,可以高效地查找到其对应的 Value。这就像一本字典(Dictionary)或电话簿,通过名字(Key)查找电话号码(Value)。

无序性 (通常): 大多数 Map 实现类(如 HashMap不保证键值对的存储顺序(插入顺序或自然顺序)。但也有保证顺序的实现(如 LinkedHashMap 保证插入顺序,TreeMap 保证按键排序)。

不允许 null (视实现而定):

  • HashMapLinkedHashMap 允许一个 null 键和多个 null 值。
  • TreeMap 不允许 null 键(因为要排序),值可以为 null
  • ConcurrentHashMap 不允许 null 键和 null 值。
  • Hashtable 不允许 null 键和 null 值。

3. 为什么需要 Map?解决了什么问题?

Map 解决了需要根据 唯一标识符 快速查找、添加、删除或更新 关联数据 的场景。例如:

  • 字典/电话簿: 根据单词查释义,根据姓名查电话。
  • 数据库记录缓存: 用主键 ID 作为 Key,缓存整个记录对象作为 Value
  • 配置信息: 配置项名称作为 Key,配置值作为 Value
  • 对象属性映射: 属性名作为 Key,属性值作为 Value
  • 计数/统计: 用物品名称作为 Key,物品数量作为 Value
  • 图结构: 表示节点之间的连接关系(邻接表)。
实现类描述键有序性允许 null 键/值底层实现
HashMap最常用。 基于哈希表实现,提供最快的查找速度(平均 O(1))。不保证 (通常无序)1个 null键, 多个 null数组 + 链表 / 红黑树 (JDK8+)
LinkedHashMap继承 HashMap额外维护一个双向链表,保证迭代顺序 == 插入顺序保证插入顺序1个 null键, 多个 null哈希表 + 双向链表
TreeMap基于 红黑树 (Red-Black Tree) 实现。保证键值对按键的自然顺序或定制顺序排序。保证键的排序顺序键不能 null, 值可以红黑树
Hashtable古老的线程安全实现 (JDK 1.0)。不推荐使用,优先选 ConcurrentHashMap不保证键和值都不能 null哈希表
ConcurrentHashMap现代高效的线程安全实现 (JDK 5+)。支持高并发读写。不保证键和值都不能 null分段锁 / CAS (JDK8+)
Properties继承 Hashtable。专门处理 属性配置文件 (key=value 格式如 .properties)。通常按文件加载顺序键和值都不能 null哈希表

4. Map 接口的常用方法

增 / 改:

  • V put(K key, V value): 添加键值对。如果键已存在,则替换旧值并返回旧值;如果键不存在,添加并返回 null
  • void putAll(Map<? extends K, ? extends V> m): 将另一个 Map 的所有键值对添加到当前 Map

删:

  • V remove(Object key): 根据键删除键值对,返回被删除的值。键不存在返回 null
  • void clear(): 清空所有键值对。

查:

  • V get(Object key): 根据键获取对应的值。键不存在返回 null
  • boolean containsKey(Object key): 判断是否包含指定的键。
  • boolean containsValue(Object value): 判断是否包含指定的值(效率通常低于 containsKey)。

视图获取:

  • Set<K> keySet(): 返回此 Map 中所有键组成的 Set 集合(因为键唯一)。
  • Collection<V> values(): 返回此 Map 中所有值组成的 Collection 集合(值可以重复)。
  • Set<Map.Entry<K, V>> entrySet(): 返回此 Map 中所有键值对 (Map.Entry 对象) 组成的 Set 集合。这是遍历 Map 最常用的方式。

其他:

  • int size(): 返回键值对的数量。
  • boolean isEmpty(): 判断 Map 是否为空。
  • default V getOrDefault(Object key, V defaultValue): (JDK8+) 获取指定键的值,如果键不存在则返回默认值。
  • default V putIfAbsent(K key, V value): (JDK8+) 如果指定键尚未与值关联(或关联为 null),则将其与给定值关联并返回 null,否则返回当前值。
  • default boolean remove(Object key, Object value): (JDK8+) 仅当指定键当前映射到指定值时删除该条目。
  • default V replace(K key, V value): (JDK8+) 仅当指定键当前映射到某个值时,才替换该条目的值。
  • default boolean replace(K key, V oldValue, V newValue): (JDK8+) 仅当指定键当前映射到指定值时,才替换该条目的值。
Map<String, Integer> phoneBook = new HashMap<>();
phoneBook.put("Alice", 123456);
phoneBook.put("Bob", 654321);
phoneBook.put("Charlie", 789012);// 方式1:使用 Map.Entry 遍历 (最推荐,效率高,一次获取key和value)
for (Map.Entry<String, Integer> entry : phoneBook.entrySet()) {String name = entry.getKey();int phoneNumber = entry.getValue();System.out.println(name + ": " + phoneNumber);
}// 方式2:遍历键 (KeySet),然后通过键找值 (效率稍低于entrySet,因为多了一次get操作)
for (String name : phoneBook.keySet()) {int phoneNumber = phoneBook.get(name);System.out.println(name + ": " + phoneNumber);
}// 方式3:仅遍历值 (Values) (如果只需要值)
for (int phoneNumber : phoneBook.values()) {System.out.println("Phone: " + phoneNumber);
}// 方式4:Java 8+ 使用 forEach + Lambda 表达式 (简洁)
phoneBook.forEach((name, phoneNumber) -> System.out.println(name + ": " + phoneNumber));

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

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

相关文章

【Unity】Unity中的StreamingAssets文件夹

目录前言核心特性1. 文件保留原始格式2. 只读访问3. 平台兼容性不同平台下的路径一、使用1、读写2、使用UnityWebRequest读取二、AB读取的特例三、注意事项前言 StreamingAssets 文件夹是Unity项目中的一个特殊目录&#xff0c;用于存放需要在运行时访问的资源文件。这个文件夹…

[windows]torchsig 1.1.0 gr-spectrumdetect模块安装

问题 按照提供的readme git clone https://github.com/TorchDSP/torchsig.git cd torchsig pip install . cd gr-spectrumdetect mkdir build cd build cmake ../ make install cd ../examples/ bash trained_model_download.sh gnuradio-companion example.grc &安装总是出…

网络安全要了解的知识

基于2025年网络安全态势整理的十大高危漏洞类型&#xff0c;结合攻击影响范围、技术严重性及实际案例分析综合排序&#xff1a;---1. 访问控制失效- 核心问题&#xff1a;权限校验缺失导致越权操作&#xff08;如修改URL参数获取他人数据&#xff09;。 - 案例&#xff1a;202…

xml 格式化

运行效果&#xff1a;免费在线XML格式化工具 - XML代码美化/压缩/验证 代码实现&#xff1a; using Microsoft.AspNetCore.Mvc; using System.Xml; using System.Xml.Linq;namespace SaaS.OfficialWebSite.Web.Controllers {public class XmlController : Controller{public I…

Pygame音频播放的最简框架代码示例

一、示例代码&#xff1a;import pygame pygame.init() pygame.mixer.init() pygame.mixer.music.load(/home/lijiang/Music/Lynyrd Skynyrd - Sweet Home Alabama.mp3) pygame.mixer.music.play()while pygame.mixer.music.get_busy():pygame.time.Clock().tick(10)二、代码详…

在Ubuntu环境中安装Docker和Minikube的完整指南

目录 前言 准备工作 第一部分&#xff1a;安装Docker 步骤1&#xff1a;卸载旧版本&#xff08;如果有&#xff09; 步骤2&#xff1a;安装依赖包 步骤3&#xff1a;添加Docker官方GPG密钥 步骤4&#xff1a;设置Docker仓库 步骤5&#xff1a;安装Docker引擎 步骤6&am…

几个概率分布在机器学习应用示例

一、说明 在这份快速指南中&#xff0c;我们将介绍最重要的分布——从始终公平的均匀分布&#xff0c;到钟形的正态分布&#xff0c;计数点击的泊松分布&#xff0c;以及二元选择的二项分布。 没有复杂的数学&#xff0c;只有清晰的概念、真实的例子&#xff0c;以及为什么它们…

2025年测绘程序设计模拟赛一--地形图图幅编号及图廓点经纬度计算

想要在2026年参加这个比赛的&#xff0c;可以加入小编和其它大佬所建的群242845175一起来备赛&#xff0c;为2026年的比赛打基础&#xff0c;也可以私信小编&#xff0c;为你答疑解惑一、读取文件 这里有两种文件需要读取&#xff0c;所以要额外处理 internal class Read {publ…

【C++基础】名字空间与 inline 命名空间:面试高频考点与真题解析

想象一下,你正在开发一个大型项目,团队中有10名程序员同时工作。当你们分别定义了calculate()函数时,编译器会陷入混乱:它不知道应该调用哪个版本的calculate。这就是C++引入名字空间(Namespace)的根本原因! 一、名字空间(Namespace)基础概念 1.1 为什么需要名字空间…

Pytest项目_day08(setup、teardown前置后置操作)

setup模块级setup_module&#xff1a;运行于模块开始之前&#xff0c;生效一次 一个py文件&#xff08;测试文件&#xff09;就是一个模块函数级setup_function&#xff1a;对于每条&#xff08;不在类中的&#xff09;函数用例生效&#xff0c;如果函数在类中&#xff0c;那么…

trae开发c#

安装插件C# Dev Kit&#xff0c;使用的版本是1.41.11 .NET Install Tool一般会自动安装&#xff0c;安装C# dev kit的时候&#xff0c;版本2.3.7 C# 插件&#xff0c;版本2.87.31 https://marketplace.visualstudio.com/items?itemNamems-dotnettools.vscode-dotnet-runtim…

Modstart 请求出现 Access to XMLHttpRequest at ‘xx‘

在 uniapp 前端页面请求时出现类似如下错误Access to XMLHttpRequest at https://example.com/api/mtiku/config from origin http://localhost:20000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control…

计算机视觉CS231n学习(5)

循环神经网络 RNN recurrent neural networksRNN序列处理能力&#xff08;RNN核心作用&#xff09; RNN处理序列数据&#xff0c;相比“Vanilla”神经网络&#xff08;仅支持一对一映射&#xff09;&#xff0c;RNN支持多种序列映射模式&#xff1a; 一对一&#xff1a;传统分类…

Spring Boot Redis 缓存完全指南

Spring Boot Redis 缓存完全指南 1. 项目依赖配置 1.1 Maven依赖 <dependencies><!-- Spring Boot Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…

八股——WebSocket

文章目录1、 什么是 WebSocket&#xff1f;与 Http 协议的区别是什么&#xff1f;2、 Http 是如何升级为 WebSocket 的&#xff1f;3、 为什么 WebSocket 可以进行全双工模式的消息传输&#xff0c;而 Http 不可以&#xff1f;4、 什么是 TCP 的沾包和拆包&#xff1f;5、 WebS…

Mysql 如何使用 binlog 日志回滚操作失误的数据

文章目录一、背景二、准备测试数据1. 创建测试表2. 创建测试数据三、模拟误操作四、数据回滚&#xff08;一&#xff09;方案一&#xff1a;云数据库恢复&#xff08;二&#xff09;方案二&#xff1a;手动恢复1. 查询 binlog 日志2. 找到删除语句&#xff0c;手动还原为插入语…

wodpress结构化数据对SEO的作用

在 WordPress 网站中&#xff0c;结构化数据对 SEO 的作用主要体现在以下几个方面&#xff1a; 1. 提升搜索结果的可见性 结构化数据能够帮助搜索引擎更好地理解网页内容&#xff0c;从而以更精准的方式展示搜索结果。通过添加结构化数据&#xff0c;网页可以在搜索结果中显示…

讲一讲@ImportResource

题目详细答案ImportResource是 Spring 框架中的一个注解&#xff0c;用于将传统的 XML 配置文件导入到基于 Java 配置的 Spring 应用程序中。它允许开发者在使用 Java 配置的同时&#xff0c;继续利用现有的 XML 配置文件。这样可以逐步迁移旧的 XML 配置&#xff0c;或者在某些…

解决 Nginx 反代中 proxy_ssl_name 环境变量失效问题:网页能打开但登录失败

前言&#xff1a;在现代企业架构中&#xff0c;多域名反向代理是实现业务隔离、品牌独立的常见方案。然而&#xff0c;看似简单的Nginx配置背后&#xff0c;隐藏着与TLS协议、后端认证逻辑深度绑定的细节陷阱。本文将从原理到实践&#xff0c;详解为何在多域名场景下&#xff0…

三步完成,A100本地vLLM部署gpt-oss,并启动远程可访问api

A100本地vLLM部署gpt-oss&#xff0c;并启动远程可访问api GPT-oss试用 gpt-oss有两个原生配置是目前&#xff08;2025-8-8&#xff09;Ampere系列显卡不支持的&#xff0c;分别是默认的MXFP4量化&#xff0c;以及Flash-attn V3。官方给出的vllm教程也是默认使用的是H系列显卡…