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

news2024/7/4 8:00:47

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.coloradmin.cn/o/1886652.html

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

相关文章

【机器学习】语音转文字 - FunASR 的应用与实践(speech to text)

本文将介绍 FunASR&#xff0c;一个多功能语音识别模型&#xff0c;包括其特点、使用方法以及在实际应用中的表现。我们将通过一个简单的示例来展示如何使用 FunASR 将语音转换为文字&#xff0c;并探讨其在语音识别领域的应用前景。 一、引言 随着人工智能技术的不断发展&am…

如何理解MySql的MVCC机制

MVCC是什么 MySQL的MVCC机制&#xff0c;全称为多版本并发控制&#xff08;Multi-VersionConcurrency Control&#xff09;&#xff0c;是一种提高数据库并发性能的技术。MVCC的主要目的是在保证数据一致性的同时&#xff0c;提高数据库的并发性能。 它通过为每个读操作创建数…

基于若依(ruoyi-vue)的周报管理系统

喂wangyinlon 填报人页面 审批人 审批不通过,填报人需要重新填写.

【漏洞复现】D-Link NAS 未授权RCE漏洞(CVE-2024-3273)

0x01 产品简介 D-Link 网络存储 (NAS)是中国友讯&#xff08;D-link&#xff09;公司的一款统一服务路由器。 0x02 漏洞概述 D-Link NAS nas_sharing.cgi接口存在命令执行漏洞&#xff0c;该漏洞存在于“/cgi-bin/nas_sharing.cgi”脚本中&#xff0c;影响其 HTTP GET 请求处…

Flink实现准确和高效流处理的关键问题

时间相关: Watermark 水位线 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据。水位线主要的内容是一个时间戳,用来表示当前事件时间的进展。水位线是基于数据的时间戳生成的。水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进,进展。水位线…

使用Arduino和超声波传感器测量声速

使用Arduino和超声波传感器测量声速 Step 1: 硬件 Arduino Uno单片机超声波传感器&#xff08;HC-SR04&#xff09;标尺跳线&#xff08;母/公&#xff09;计算器 Step 2: Arduino Uno 微控制器 The Arduino Uno is a credit card size microcontroller board. Arduino Uno是…

信息学奥赛初赛天天练-42-CSP-J2020基础题-变量地址、编译器、逻辑运算、逻辑与运算、逻辑或运算、冒泡排序、递归应用

PDF文档公众号回复关键字:20240702 2020 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1.在内存储器中每个存储单元都被赋予一个唯一的序号&#xff0c;称为&#xff08; &#xff0…

JavaScript中的Array(数组)对象

目录 一、Array数组对象 1、介绍 2、创建数组对象并赋值 3、访问数组元素 二、Array对象属性 1、constructor属性 2、length属性 3、prototype属性 三、Array对象的常用方法 1、isArray() 2、concat() 3、pop() 4、shift() 5、push() 6、unshift() 7、reverse(…

VQA视觉问答系统

这是一个典型的多模态问题,融合了CV与NLP的技术,计算机需要同时学会理解图像和文字。 Joint embedding 首先,图像和问题分别由CNN和RNN进行第一次编码得到各自的特征,随后共同输入到另一个编码器中得到joint embedding,最后通过解码器输出答案。 值得注意的是,有的工作…

我与C++的爱恋:list的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 一、list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2.list的底层是双向链表结构&#xff0c;双向链表中…

python: create Envircomnet in Visual Studio Code 创建虚拟机

先配置python开发环境 1.在搜索栏输入“>" 或是用快捷组合键ctrlshiftP键 就会显示”>",再输入"python:" 选择已经安装好的python的版本,选定至当前项目中&#xff0c;都是按回车 就可以看到创建了一个虚拟机的默认的文件夹名".venv" 2 te…

KUKA仿真教学8:设备保养屏蔽

目录 一、屏蔽步骤 一、屏蔽步骤

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代&#xff0c;电脑数据的价值日益凸显。然而&#xff0c;数据丢失、误删、系统崩溃等问题时有发生&#xff0c;给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法&#xff0c;同时推荐五款高效的电脑数据恢复工具&#xff0c;助您轻松应对数据丢失的困扰。…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

全面了解机器学习

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

高通骁龙(Qualcomm Snapdragon)CDSP HVX HTP 芯片简介与开发入门

1. Hexagon DSP/HVX/HTP 硬件演进 说到高通骁龙芯片大家应该不会陌生&#xff0c;其作为最为广泛的移动处理器之一&#xff0c;几乎每一个品牌的智能手机都会使用高通骁龙的处理器。 高通提供了一系列骁龙芯片解决方案。根据性能强弱分为了5个产品系列&#xff1a;从最高端的…

verilog实现PID控制

1 原理讲解 距离上一次说PID算法的事情过去蛮久了&#xff0c;今天又重新看了看PID的代码&#xff0c;其实还是存在一些不合理的地方。 整理归纳了一下原理&#xff0c;位置式和增量式的变化。 2 工程实现 timescale 1ns / 1psmodule pid_controller(input clk,input r…

MySQL——事务ACID原则、脏读、不可重复读、幻读

什么是事务 要么都成功&#xff0c;要么都失败 一一一一一一一 1. SQL执行&#xff1a;A给B转账 A 1000 ---->200 B 200 2. SQL执行&#xff1a;B收到A的钱 A 800 B 400 一一一一一一一 将一组SQL放在一个批次中去执行~ 事务原则&#xff1a;ACI…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

线程状态转换总结

1. NEW -> RUNNABLE 创建线程后是 NEW 状态&#xff08;只是 Java 层面新建的&#xff0c;还没有关联到操作系统实际的线程上&#xff09;&#xff0c;调用线程的 start() 方法会将 Java 线程和操作系统的线程关联起来&#xff0c;进入 RUNNABLE 状态 2. RUNNABLE <->…