Java中的集合(1)——List、Map和Set

        Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。Java的java.util包中提供了以下三种类型的集合:

  • List:一种有序列表的集合,例如,按索引排列的StudentList

  • Set:一种保证没有重复元素的集合,例如,所有无重复名称的StudentSet

  • Map:一种通过键值(key-value)查找的映射表集合,例如,根据Studentname查找对应StudentMap

1. List

  List 是 Java 中 java.util 包下的一个接口,它继承自 Collection 接口,表示一种有序且可以包含重复元素的集合。List 提供了丰富的方法来访问、操作和遍历集合中的元素。

1.1 List 的特点

  1. 有序性:List 保持元素的插入顺序,即元素会按照它们被添加到集合中的顺序存储。
  2. 允许重复元素:List 允许包含相同的元素,即重复值是允许的。
  3. 索引访问:List 提供了按索引(位置)访问元素的能力,允许通过数字索引直接获取、设置、删除和插入元素。

1.1 常见的 List 实现类

  1. ArrayList

    • 特点:基于动态数组实现,支持快速随机访问,查询性能好(时间复杂度为 O(1)),但插入和删除元素的效率相对较低(特别是从中间位置插入或删除)。
    • 应用场景:适合在需要频繁读取数据的场景,比如读取数据库查询结果列表、存储临时数据等。
    • 注意:当元素较多时,频繁插入或删除会导致性能下降。
  2. LinkedList

    • 特点:基于双向链表实现,适合频繁插入和删除操作(时间复杂度为 O(1)),但随机访问性能较差(时间复杂度为 O(n))。
    • 应用场景:适合在需要频繁添加或删除元素的场景,比如实现队列或栈的功能。
  3. Vector

    • 特点:类似于 ArrayList,但 Vector 是线程安全的,因为它的所有方法都是同步的。不过它的性能相对较低,因为同步的开销较大。
    • 应用场景:适合在多线程环境下使用,但现代应用中更推荐使用 Collections.synchronizedList() 或并发包中的 CopyOnWriteArrayList
  4. CopyOnWriteArrayList

    • 特点:线程安全的 List,写操作会创建副本,读操作不需要加锁,因此适合读多写少的场景。
    • 应用场景:适合多线程环境下的读操作非常频繁、写操作较少的场景,比如缓存。

1.3 List 常用方法

  • 添加元素
    list.add("element"); // 添加元素到末尾 list.add(1, "element"); // 在指定位置添加元素
  • 获取元素
    String element = list.get(0); // 获取指定索引的元素
  • 更新元素
    list.set(1, "newElement"); // 替换指定索引的元素
  • 删除元素
    list.remove(0); // 删除指定索引的元素 list.remove("element"); // 删除指定值的元素
  • 查询大小
    int size = list.size(); // 返回列表中的元素数量
  • 遍历列表
    for (String element : list) { System.out.println(element); }

1.4 List 的应用场景

  • 动态数组:当数组大小在程序执行期间会变化时,ArrayList 是一个很好的选择。
  • 需要按顺序处理数据:List 保持插入顺序,适合需要按顺序处理数据的场景。
  • 允许重复数据:如果允许存储重复的对象(如购物车中的商品),可以使用 List

2. Map

   Map 是 Java 中的一个重要接口,它位于 java.util 包下,表示一种键值对(key-value)的数据结构。Map 不属于 Collection 接口的子接口,但与集合框架紧密相关。它主要用于根据键(key)来查找、存储和操作对应的值(value)。在 Map 中,每个键都是唯一的,但值可以重复。

2.1 Map 的特点

  1. 键唯一:每个键在 Map 中是唯一的,不能重复。添加新的键值对时,如果键已存在,新的值会替换掉旧的值。
  2. 通过键查找值:Map 提供了通过键快速查找对应值的功能。
  3. 无序或有序:不同的 Map 实现类对键值对的顺序有不同的处理方式。HashMap 无序,TreeMap 是有序的。

2.2 常见的 Map 实现类

  1. HashMap

    • 特点:基于哈希表实现,允许 null 键和 null 值。它提供了快速的查找、插入和删除操作,适合大多数场景。
    • 无序HashMap 不保证键值对的顺序,即插入的顺序和取出的顺序可能不同。
    • 应用场景:适合需要快速查找键值对的场景,如存储缓存数据、用户 ID 和其信息等。
  2. LinkedHashMap

    • 特点:继承自 HashMap,但保留了插入顺序或访问顺序。它内部维护了一个双向链表,来记录元素的插入顺序。
    • 有序:当你需要遍历 Map 时希望元素按插入顺序(或访问顺序)返回,可以使用 LinkedHashMap
    • 应用场景:适合需要维护键值对插入顺序的场景,如实现 LRU(最近最少使用)缓存。
  3. TreeMap

    • 特点:基于红黑树实现,键值对会按照键的自然顺序(或自定义的比较器顺序)排序。
    • 有序:按键的顺序存储数据,适合需要排序的场景。
    • 应用场景:适合需要按键排序的场景,如按字母顺序排列的词典、按键进行范围查询等。
  4. Hashtable

    • 特点:一种古老的线程安全实现,所有方法都是同步的,不允许 null 键或 null 值。
    • 线程安全:由于同步机制,其性能相对较低,现在更推荐使用 ConcurrentHashMap 来替代。
    • 应用场景:适合多线程环境,但不推荐在现代 Java 编程中使用,除非需要特定的线程安全需求。
  5. ConcurrentHashMap

    • 特点:线程安全的 HashMap 实现,适合多线程环境。它的性能比 Hashtable 高,因为它使用了更精细的锁机制(锁分段)。
    • 应用场景:适合在并发环境下频繁读写数据的场景,如多线程的缓存或共享资源存储。

2.3 Map 常用方法

  • 插入键值对
    map.put("key", "value"); // 插入或更新键值对
  • 获取值
    String value = map.get("key"); // 根据键获取对应的值
  • 删除键值对
    map.remove("key"); // 根据键删除对应的键值对
  • 判断是否包含键或值
    map.containsKey("key"); // 判断 Map 是否包含指定的键 map.containsValue("value"); // 判断 Map 是否包含指定的值
  • 遍历 Map
    • 使用 keySet() 遍历键:
      for (String key : map.keySet()) { System.out.println(key + ": " + map.get(key)); }
    • 使用 entrySet() 遍历键值对:
      for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); }

2.4 Map 的应用场景

  • 快速查找数据:例如,在电话簿中查找电话号码,通过唯一的姓名(键)找到对应的电话号码(值)。
  • 数据关联关系:存储键值对之间的映射关系,如用户 ID 和用户信息、商品编号和商品详情。
  • 实现缓存机制LinkedHashMap 可以用于实现基于访问顺序的 LRU 缓存。

2.5 线程安全问题

        通的 HashMap 并不是线程安全的,因此在多线程环境中,可能会导致数据不一致的问题。可以使用 Collections.synchronizedMap() 方法将 HashMap 变为线程安全的,或者使用更高效的 ConcurrentHashMap

2.6 小结

  • HashMap:无序,适合快速查找,允许 null 键和值。
  • LinkedHashMap:有序,按插入顺序或访问顺序存储元素。
  • TreeMap:有序,按键的自然顺序或自定义顺序排序。
  • ConcurrentHashMap:线程安全,适合多线程环境。

3. Set

   Set 是 Java 中 java.util 包中的一个接口,继承自 Collection,用于存储不允许重复的元素。与 List 不同,Set 不保证元素的顺序,除非使用特定的实现类。Set 常用于去重、集合运算等场景。

3.1 Set 的特点

  1. 无重复元素:Set 不允许存储重复的元素。添加重复元素时,添加操作会被忽略。
  2. 无固定顺序:Set 的实现类可能不会保持元素的插入顺序(如 HashSet),但某些实现类会有序(如 LinkedHashSetTreeSet)。
  3. 效率高:Set 通常比 List 更高效,特别是在查找和去重方面。

3.2 常见的 Set 实现类

  1. HashSet

    • 特点:基于哈希表实现,存储元素时无序,允许 null 元素。HashSet 提供快速的增删查操作,通常比 List 更快。
    • 无序HashSet 不保证元素的存储顺序,插入顺序与遍历顺序可能不同。
    • 应用场景:适用于需要快速去重和高效查询的场景,比如存储唯一的用户 ID、唯一的商品代码等。
  2. LinkedHashSet

    • 特点:继承自 HashSet,但在内部使用链表来维护元素的插入顺序,因此元素的遍历顺序与插入顺序相同。
    • 有序:与 HashSet 不同,LinkedHashSet 保留了元素的插入顺序。
    • 应用场景:当你需要去重并保留元素的插入顺序时,比如按顺序存储唯一的登录记录。
  3. TreeSet

    • 特点:基于红黑树实现,元素按自然顺序(或自定义比较器顺序)排序。由于排序机制,TreeSet 不允许 null 元素。
    • 有序TreeSet 自动对元素进行排序,支持按顺序遍历元素。
    • 应用场景:需要对元素进行排序时,如按字母顺序排序的唯一用户名集合,或者需要对数据进行范围查询的场景。

3.3 Set 常用方法

  • 添加元素
    set.add("element"); // 添加元素,若元素已存在,操作会被忽略
  • 删除元素
    set.remove("element"); // 删除指定的元素
  • 检查是否包含某元素
    set.contains("element"); // 检查 Set 中是否包含指定的元素
  • 获取大小
    int size = set.size(); // 获取 Set 中元素的数量
  • 遍历 Set
    for (String element : set) { System.out.println(element); }

3.4 Set 的应用场景

  1. 去重:Set 不允许重复元素,因此常用于需要自动去重的场景。比如,在集合中保存一组用户 ID,并确保每个用户只能添加一次。
  2. 快速查找:Set 可以提供高效的查找操作,特别是 HashSet,可以在 O(1) 时间内判断一个元素是否存在。
  3. 集合操作:Set 接口常用于实现数学集合的操作,如交集、并集和差集等。
    • 交集:两个集合中的公共元素。
      set1.retainAll(set2);
    • 并集:两个集合的所有元素。
      set1.addAll(set2);
    • 差集:属于第一个集合但不属于第二个集合的元素。
      set1.removeAll(set2);

3.5 线程安全问题

        HashSet 和其他常见的 Set 实现类都不是线程安全的。在多线程环境下,可能会出现并发修改异常。可以通过 Collections.synchronizedSet() 方法将 Set 包装为线程安全的版本,或者使用并发包中的 ConcurrentSkipListSet 来处理多线程场景。

3.6 Set 与 List 的区别

  • 是否允许重复元素Set 不允许重复元素,而 List 允许。
  • 有序性List 保证元素的插入顺序,而 Set 的实现类(如 HashSet)通常不保证顺序。LinkedHashSet 保证插入顺序,TreeSet 保证排序顺序。
  • 访问方式List 可以通过索引随机访问元素,而 Set 没有索引,需要通过遍历来访问。

3.7 小结

  • HashSet:无序,不允许重复,适合快速查找和去重。
  • LinkedHashSet:有序,不允许重复,适合需要保留插入顺序的场景。
  • TreeSet:有序(按自然顺序或自定义顺序),不允许重复,适合需要排序的场景。

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

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

相关文章

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素&#xff0c;在A列右边的空白列中&#xff0c;输入如下公式&#xff1a; COUNTIF($B$1:$B$7,A1), 其中&#xff0c;$B$1:$B$7代表A列中的所有数据即绝对范围&#xff0c;A1代表B列中的一个单元格.

Servlet(一)

一.什么是servlet Servlet 是一种实现动态页面的技术。 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app。 1.回顾 动态页面 vs 静态页面 静态页面也就是内容始终固定的页面。即使 用户不同/时间不同/输入的参数不同 , 页面内容也不会发生变化。(除…

从 Microsoft 官网下载 Windows 10

方法一&#xff1a; 打开 Microsoft 官网&#xff1a; 打开开发人员工具&#xff08;按 F12 或右键点击“检查”&#xff09;。 点击“电脑模拟手机”按钮&#xff0c;即下图&#xff1a; 点击后重新加载此网页&#xff0c;即可看到下载选项。

jenkins 用ssh 启动nohup java -jar显示执行成功 但是jar包没有被启动起来 (已解决)

问题描述 使用jenkins自动部署jar包. 打包传到服务后, 停止stop.sh脚本执行成功. 并且 xx.jar 也成功停止. 但是使用jenkins执行start.sh脚本执行成功, 但是服务器上xx.jar并没有启动起来. 启动命令是 nohup java -jar **.jar --spring.cloud.bootstrap.namebootstrap-debug&…

demo_GAN

# 导入PyTorch库&#xff0c;这是一个用于深度学习的开源库 import torch # 导入PyTorch的神经网络模块&#xff08;nn&#xff09;&#xff0c;用于定义神经网络结构 import torch.nn as nn # 导入PyTorch的函数式模块&#xff08;functional&#xff09;&#xff0c;提供了一…

把其他.ui文件拿到我的工程中使用

在Qt工程中使用工程外的ui文件的方式&#xff1a;作为一个类直接使用、包含到自己的类中或继承使用 将ui文件添加到工程中&#xff0c;作为一个类以直接使用 注&#xff1a;这里指使用原本不属于该工程的ui文件第一步&#xff1a;在工程文件.pro中添加UI文件 在.proj文件中添加…

每日一题——第一百一十七题

题目&#xff1a;使用二分查找&#xff0c;查找一个数是否存在于一个升序数组中 #include <stdio.h>int binarySearch(int arr[], int length, int elem);int main() {int arr[] { 2, 3, 4, 5, 6, 7, 8, 9, 10 };int key;int length sizeof(arr) / sizeof(arr[0]);pri…

Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)

0x01 产品介绍&#xff1a; Palo Alto Networks Expedition 是一款强大的工具&#xff0c;帮助用户有效地迁移和优化网络安全策略&#xff0c;提升安全管理的效率和效果。它的自动化功能、策略分析和可视化报告使其在网络安全领域中成为一个重要的解决方案。 0x02 漏洞描述&am…

windows下安装、配置neo4j并服务化启动

第一步&#xff1a;下载Neo4j压缩包 官网下载地址&#xff1a;https://neo4j.com/download-center/ &#xff08;官网下载真的非常慢&#xff0c;而且会自己中断&#xff0c;建议从以下链接下载&#xff09; 百度网盘下载地址&#xff1a;链接&#xff1a;https://pan.baid…

FFMPEG录屏(17)--- 使用 DwmRegisterThumbnail 捕获指定窗口图像数据

使用 DwmRegisterThumbnail 捕获指定窗口图像数据 在 Windows 平台上&#xff0c;捕获指定窗口的图像数据可以通过多种方法实现&#xff0c;其中一种高效的方法是使用 [DwmRegisterThumbnail] 本文将介绍如何使用 [DwmRegisterThumbnail] 捕获窗口图像数据&#xff0c;并提供一…

Mysql中表字段VARCHAR(N)类型及长度的解释

本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释&#xff0c;主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数&#xff0c;而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数&#xff1a;指的是字符的个数&…

计算机视觉在疲劳检测中的应用

计算机视觉在疲劳检测中的应用 引言 随着科技的飞速发展&#xff0c;计算机视觉技术已经广泛应用于各个领域&#xff0c;其中疲劳检测是近年来备受关注的一个研究方向。疲劳检测旨在通过计算机视觉技术&#xff0c;实时分析个体的面部特征、动作以及生理信号等&#xff0c;判…

周易解读:八卦02,八卦所代表的基本事物

八 卦02 上一节&#xff0c;我是讲完了八卦的卦象的画法的问题。这一节&#xff0c;我来尝试着去讲解八卦所代表的自然事物。 八卦是谁发明的呢&#xff1f;根据《周易说卦传》的说法&#xff0c;八卦是伏羲发明的。伏羲氏仰观天文&#xff0c;俯察地理&#xff0c;从中提取…

项目模块二:日志宏

一、代码展示 二、补充知识 1、LOG(level, format, ...) format 是用于宏识别格式化&#xff0c;类似于 printf("%s", str); 里面的 "%s" ... 不定参&#xff0c;传入宏的参数除了 level, format, 还有不确定个数的参数。 2、红色 \ 由于宏只能写在一…

PyTorch深度学习入门汇总

PyTorch 是由 Facebook 的人工智能研究小组开发的深度学习框架&#xff0c;可以基于PyTorch开发和训练各种深度学习模型。自 2016 年问世以来&#xff0c;PyTorch 因其灵活性和易用性而受到深度学习从业者的极大关注。 汇总目录 基于conda包的环境创建、激活、管理与删除 Pyt…

链上相遇,节点之间的悸动与牵连

公主请阅 1. 返回倒数第 k 个节点1.1 题目说明1.2 题目分析1.3 解法一代码以及解释1.3 解法二代码以及解释 2.相交链表2.1 题目说明示例 1示例 2示例 3 2.2 题目分析2.3 代码部分2.4 代码分析 1. 返回倒数第 k 个节点 题目传送门 1.1 题目说明 题目名称&#xff1a; 面试题 02…

15分钟学 Go 第 10 天:函数参数和返回值

第10天&#xff1a;函数参数和返回值 目标&#xff1a;理解函数如何传递参数 在Go语言中&#xff0c;函数是程序的基本构建块。了解如何传递参数和返回值是编写高效、可复用代码的重要步骤。本文将详细讲解函数参数的类型、传递方式以及如何处理返回值&#xff0c;辅以代码示…

用C++编写一个简单的游戏引擎:从游戏循环到物理与渲染的全面解析

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 构建一个基础的2D游戏引擎是一项富有挑战性但极具学习价值的任务。本文将通过从零开始的方式,逐步讲解如何使用C++开发一个简单的游戏引擎。内容涵盖了游戏引擎的核心架构设计,包括游戏循环、物理引擎和图形渲染…

DP—子数组,子串系列 第一弹 -最大子数组和 -环形子数组的最大和 力扣

你好&#xff0c;欢迎阅读我的文章~ 个人主页&#xff1a;Mike 所属专栏&#xff1a;动态规划 ​ 53. 最大子数组和 最大子数组和 ​ 分析: 使用动态规划解决 状态表示: 1.以某个位置为结尾 2.以某个位置为起点 这里使用以某个位置为结尾&#xff0c;结合题目要求&#…

MySQL8.0主从同步报ERROR 13121错误解决方法

由于平台虚拟机宿主机迁移&#xff0c;导致一套MySQL主从库从节点故障&#xff0c;从节点服务终止&#xff0c;在服务启动后&#xff0c;恢复从节点同步服务&#xff0c;发现了如下报错&#xff1a; mysql> show slave status\G; *************************** 1. row *****…