Java核心技术【十八】Java集合框架精讲:List、Set、Map

Java集合框架精讲:List、Set、Map的使用详解与代码示例

Java集合框架是Java编程中不可或缺的一部分,它提供了一系列容器类,用于存储和操作不同类型的数据集。在Java集合框架中,ListSetMap是最常用的三种集合类型,它们各自具有独特的特性和使用场景。本文将详细介绍这三种集合的特性和使用场景,并通过代码示例帮助你更好地理解它们的运作机制,同时对比它们在不同场景下的适用性。

一、List:有序且允许重复的集合

List是一种有序的集合,它允许元素重复,并且可以保持元素的插入顺序。List的主要实现类包括ArrayListLinkedList

1. ArrayList

ArrayList是基于动态数组实现的List,它提供了随机访问元素的能力,适用于需要频繁访问元素但较少修改元素的场景。

1.1 特点

  • 基于动态数组实现,提供了随机访问元素的能力。
  • 在数组末尾添加元素效率较高,但在数组中间插入或删除元素效率较低,因为需要移动大量元素。
  • 元素是有序的,且可以包含重复元素。

1.2 适用场景

  • 当你需要频繁访问集合中的元素时,ArrayList是不错的选择。
  • 如果集合的大小已知或接近最终大小,使用ArrayList可以避免多次扩容带来的性能损耗。
  • 不适合需要频繁在集合中间进行插入或删除操作的场景。

1.3 代码示例

package java_core_18;
import java.util.List;
import java.util.ArrayList;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: " + list);System.out.println("List中的第一个元素: " + list.get(1));}}

1.4 运行结果

List: [Apple, Banana, Cherry]
List中的第一个元素: Banana

2. LinkedList

LinkedList是基于双向链表实现的List,它在元素的添加和删除操作上表现更优,适用于需要频繁修改元素的场景,尤其是在集合头部或尾部进行操作。

2.1 特点:

  • 基于双向链表实现,适合在集合的任意位置插入或删除元素。
  • 随机访问元素效率较低,因为需要从头遍历链表。
  • 元素是有序的,且可以包含重复元素。

2.2 适用场景:

  • 当你需要频繁在集合的任意位置进行插入或删除操作时,LinkedList是一个好的选择。
  • 如果集合中元素的访问主要是通过迭代器进行的,LinkedList可以提供较好的性能。
  • 不适合需要频繁随机访问元素的场景。

2.3 示例代码

package java_core_18;
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: " + list);list.remove(1); // 从list中删除 "Banana"元素System.out.println("新的 List: " + list);}}

2.4 运行结果

List: [Apple, Banana, Cherry]
新的 List: [Apple, Cherry]

二、Set:无序且不允许重复的集合

Set是一种不允许元素重复的集合,它不保证元素的顺序。Set的主要实现类包括HashSetTreeSet

1. HashSet

HashSet是基于哈希表实现的Set,它提供了较快的添加和查找速度,但元素的顺序是不确定的。HashSet适用于需要快速查找元素的场景。

1.1 特点

  • HashSet是基于HashMap实现的,底层使用HashMap来存储元素,因此元素是无序的。
  • 不允许重复元素,通过equals()hashCode() 方法来判断元素的相等性。
  • 提供了常数时间复杂度 (算法的执行时间是常量,不随输入规模的增加而增加) 的添加、删除和查找操作。

1.2 适用场景

  • 当你需要存储一个元素集合,且需要快速判断元素是否存在集合中时,HashSet是一个很好的选择。
  • 如果集合中的元素需要唯一性,并且元素的顺序不重要,使用HashSet可以提供高效的元素管理和查找。
  • 适合需要快速添加和删除元素的场景,特别是在处理大数据量时,HashSet的性能优势明显。

1.3 示例代码

package java_core_18;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: " + set);}
}

1.4 运行结果

Set: [Apple, Banana]

2. TreeSet

TreeSet是基于红黑树实现的Set,它保证元素的自然排序或自定义排序,适用于需要排序的场景,例如存储唯一且需要排序的元素集合。

2.1 特点

  • 基于红黑树实现,保证了元素的自然排序或自定义排序。
  • 元素是无序的(从客户端角度看),但从内部实现上看,元素按照排序规则存储。
  • 不允许重复元素。

2.2 适用场景

  • 当你需要存储一个元素集合,并且需要这些元素自动排序时,使用TreeSet
  • 如果集合中的元素需要唯一性,并且排序是必要的,TreeSet是一个理想的选择。
  • 不适合需要频繁随机访问元素的场景,虽然TreeSet提供了对数时间复杂度的查找,但相比ArrayList的随机访问还是较慢。

2.3 代码示例

package java_core_18;import java.util.TreeSet;
import java.util.Set;public class TreeSetExample {public static void main(String[] args) {Set<String> set = new TreeSet<>();set.add("Banana");set.add("Apple");set.add("Cherry");System.out.println("排序Set: " + set);}
}

2.4 执行结果

可以看到Set集合中自动根据元素的开头英文字母进行了排序:

排序Set: [Apple, Banana, Cherry]

三、Map:键值对集合

Map是一种将键映射到值的集合,每个键都是唯一的,且只能映射一个值。Map的主要实现类包括HashMapTreeMap

1. HashMap

HashMap是基于哈希表实现的Map,提供了快速的键值对添加和查找能力,但不保证键值对的顺序。适用于需要快速查找和插入键值对的场景。

1.1 特点:

  • HashMap是基于哈希表实现的键值对集合,提供了快速的键值对查找、插入和删除操作。
  • 键是唯一的,不允许重复,但值可以重复。
  • 提供了平均常数时间复杂度的键值对查找、插入和删除操作。

1.2 适用场景:

  • 当你需要存储键值对,且需要快速通过键来查找对应的值时,HashMap是一个理想的解决方案。
  • 如果键值对集合中的键需要唯一性,并且不需要排序,HashMap提供了高效的查找和插入性能。
  • 适合处理大量数据,特别是当键值对的数量很大时,HashMap的高性能查找可以显著提升应用的响应速度。

1.3 示例代码

package java_core_18;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("Map: " + map);System.out.println("Apple的值为: " + map.get("Apple"));}
}

1.4 运行结果

Map: {Apple=1, Cherry=3, Banana=2}
Apple的值为: 1

2. TreeMap

TreeMap是基于红黑树实现的Map,它保证键值对按照键的自然顺序或自定义排序,适用于需要排序的场景,例如存储需要按照一定顺序访问的键值对集合。

2.1 特点

  • 基于红黑树实现,保证了键值对按照键的自然排序或自定义排序。
  • 键是唯一的,不允许重复。
  • 提供了对数时间复杂度 (表示算法的运行时间随着输入规模n的增加而以对数的速度增长)的键值对查找、插入和删除操作。

2.2 适用场景

  • 当你需要存储键值对,并且需要这些键值对自动排序时,使用TreeMap
  • 如果键值对集合中的键需要唯一性,并且排序是必要的,TreeMap是一个理想的选择。
  • 不适合需要频繁随机访问键值对的场景,虽然TreeMap提供了对数时间复杂度的查找,但相比HashMap平均常数时间复杂度还是较慢。

2.3 代码示例

package java_core_18;import java.util.TreeMap;
import java.util.Map;public class TreeMapExample {public static void main(String[] args) {Map<String, Integer> map = new TreeMap<>();map.put("Banana", 2);map.put("Apple", 1);map.put("Cherry", 3);System.out.println("排序Map: " + map);}
}

2.4 执行结果

排序Map: {Apple=1, Banana=2, Cherry=3}

结束语

在Java中选择集合类型时,ArrayList适合随机访问和较少的中间插入删除;LinkedList适用于频繁的两端插入删除和迭代访问;HashSetHashMap提供快速的查找和不重复元素/键的存储,适合不需要排序的场景;而TreeSetTreeMap则保证了元素和键值对的排序,适合需要排序和唯一性的场景。选择时应综合考虑数据访问模式、操作需求、排序需求和性能要求,以达到最优的代码效率和可维护性。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。
源码地址:https://gitee.com/code-in-java/csdn-blog.git

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

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

相关文章

小红书运营教程02

小红书大致会分享10篇左右。微博、抖音、以及视频剪辑等自媒体运营相关技能以及运营教程相关会陆续的进行分享。 上次分享涉及到的对比,母婴系列,或者可以说是服装类型,不需要自己过多的投入,对比知识类博主来说,自己将知识讲述出来,然后要以此账号进行变现就比较麻烦,…

道可云元宇宙每日资讯|山东出台人形机器人产业发展路线

道可云元宇宙每日简报&#xff08;2024年7月1日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 山东出台人形机器人产业发展路线 近期&#xff0c;山东省工业和信息化厅等部门印发《山东省促进人形机器人产业创新发展实施方案&#xff08;2024—2027年&#xff0…

如果这时你还不清理C盘,那只能眼睁睁看着电脑越来越卡 直到系统崩溃

如果这时候你还不清理C盘&#xff0c;那只能眼睁睁看着电脑越来越卡 直到系统崩溃。很多人就是想偷懒&#xff0c;当然这是人的天性&#xff0c;明明知道自己的C盘空间就那么大&#xff0c;一天天看着C盘空间越来越小&#xff0c;还不去清理C盘。 这样的人有两种&#xff0c;一…

CesiumJS【Basic】- #048 绘制闪烁线(Primitive方式)

文章目录 绘制闪烁线(Primitive方式)- 需要自定义着色器1 目标2 代码2.1 main.ts绘制闪烁线(Primitive方式)- 需要自定义着色器 1 目标 使用Primitive方式绘制闪烁线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesiu

软件开发案例参考

前言&#xff1a;基于平台现有需求进行新功能模块开发与实现&#xff0c;以下内容为部分源码解析&#xff0c;仅提供一些思路参考&#xff0c;不予以客观指导&#xff0c;毕竟条条大路通罗马嘛&#xff1b; 语言&#xff1a;C# 工具&#xff1a;visual studio 2017/visual st…

【MySQL List插入】MySQL List格式数据插入

其中id为对应的函数名&#xff0c;useGeneratedKeys是否主键自动生成&#xff0c;keyProperty主键关联的属性。 <foreach collection"list" item"element" index"index" separator",">确定集合类型&#xff0c;item每个元素表示…

C++基础(二):C++入门(一)

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式 等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本篇博客主要目标&#xff1a; 1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计…

【RabbitMQ实战】邮件发送(直连交换机、手动ack)

一、实现思路 二、异常情况测试现象及解决 说明:本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认机制 、消费确认机制 、消息的重新投递 、消费幂等性, 二、实现思路 1.简略介绍163邮箱授权码的获取 2.编写发送邮件工具类 3.编写RabbitMQ配置文件 4.生产者发起调用…

高考失利咨询复读,银河补习班客服开挂回复

补习班的客服在高考成绩出来后&#xff0c;需要用专业的知识和足够的耐心来回复各种咨询&#xff0c;聊天宝快捷回复软件&#xff0c;帮助客服开挂回复。 ​ 前言 高考成绩出来&#xff0c;几家欢喜几家愁&#xff0c;对于高考失利的学生和家长&#xff0c;找一个靠谱的复读补…

全面了解机器学习

目录 一、基本认识 1. 介绍 2. 机器学习位置 二、机器学习的类型 1. 监督学习 2. 无监督学习 3. 强化学习 三、机器学习术语 1. 训练样本 2. 训练 3. 特征 4. 目标 5. 损失函数 四、机器学习流程 五、机器学习算法 1. 分类算法 2. 聚类算法 3. 关联分析 4. …

Qt入门教程(一):Qt使用的基本知识

目录 Qt简介 新建项目 构建目录和工作目录 构建目录 工作目录 项目结构 项目配置文件 .pro 用户文件 .user 主文件 main.cpp 头文件 dialog.h 源文件 dialog.cpp 帮助文档 三种查询文档的方式&#xff1a; 文档的重点位置&#xff1a;​编辑 调试信息 Qt简介 Qt…

java 代码块

Java中的代码块主要有三种类型&#xff1a;普通代码块、静态代码块、构造代码块。它们的用途和执行时机各不相同。 普通代码块&#xff1a;在方法内部定义&#xff0c;使用一对大括号{}包围的代码片段。它的作用域限定在大括号内&#xff0c;每当程序执行到该代码块时就会执行其…

全平台7合一自定义小程序源码系统功能强大 前后端分离 带完整的安装代码包以及搭建教程

系统概述 这款全平台 7 合一自定义小程序源码系统是专为满足各种业务需求而设计的。它整合了多种功能&#xff0c;能够在不同平台上运行&#xff0c;为用户提供了全方位的体验。无论你是企业主、开发者还是创业者&#xff0c;这款系统都能为你提供强大的支持。 代码示例 系统…

crewAI实践(包含memory的启用)--AiRusumeGenerator

crewAI实践--AiRusumeGenerator 什么是crewAIAiRusumeGenerator功能效果展示开发背景开发步骤1. 首先得学习下这款框架原理大概用法能够用来做什么&#xff1f; 2. 安装crewAI以及使用概述3. 写代码Agents.pyTasks.pymian.py关于task中引入的自定义工具这里不再赘述 什么是crew…

C# 截取图片

C#从图中截取部分图片 代码实现截图_c# net core webapi如何通过图片大小区域范围进行截图-CSDN博客

V Rising夜族崛起的管理员指令大全

使用方法&#xff1a; 如果没有启用控制台需要先启用控制台 打开游戏点击选项&#xff08;如果在游戏内点击ESC即可&#xff09;&#xff0c;在通用页面找到启用控制台&#xff0c;勾选右边的方框启用 在游戏内点击键盘ESC下方的波浪键&#xff08;~&#xff09;使用控制台 指…

Vue的服务器代理如何配置

在Vue项目中配置服务器代理&#xff0c;主要是为了解决开发过程中的跨域问题&#xff0c;以及方便地将前端请求转发到后端服务器。以下是在Vue项目中配置服务器代理的详细步骤和注意事项&#xff0c;主要基于Vue CLI进行说明&#xff1a; 一、配置步骤 1. 确认项目环境 确保…

构建LangChain应用程序的示例代码:49、如何使用 OpenAI 的 GPT-4 和 LangChain 库实现多模态问答系统

! pip install "openai>1" "langchain>0.0.331rc2" matplotlib pillow加载图像 我们将图像编码为 base64 字符串&#xff0c;如 OpenAI GPT-4V 文档中所述。 import base64 import io import osimport numpy as np from IPython.display import HT…

PDF一键转PPT文件!这2个AI工具值得推荐,办公必备!

PDF转换为PPT文件&#xff0c;是职场上非常常见的需求&#xff0c;过去想要把PDF文件转换为PPT&#xff0c;得借助各种文件转换工具&#xff0c;但在如今AI技术主导的大背景下&#xff0c;我们在选用工具时有了更多的选择&#xff0c;最明显的就是基于AI技术打造的AI格式转换工…

《昇思25天学习打卡营第21天 | 昇思MindSporePix2Pix实现图像转换》

21天 本节学习了通过Pix2Pix实现图像转换。 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN&#xff09;实现的一种深度学习图像转换模型。可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线稿图到实物图的转换。Pix2Pix是将cGAN应用于有监督的图…