List、Set、Map详解和区别

在 Java 中,ListSetMap是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析:

List(列表)

  • 特点
    • 有序性List中的元素是有序的,即元素的存入顺序和取出顺序是一致的。例如,先存入元素 A,再存入元素 B,那么按照顺序取出时,会先得到 A,然后是 B
    • 可重复性:允许存储重复的元素。可以在同一个 List 中多次添加相同的对象。
    • 元素可通过索引访问:能够通过索引(下标)来获取、修改或删除元素,索引从 0 开始,就像操作数组一样方便。例如,可以使用 list.get(0) 获取列表中的第一个元素。
  • 常见实现类及用法
    • ArrayList
      • 内部基于数组实现,查询效率高,因为可以通过数组下标直接定位元素。例如,在一个存储大量学生信息的 ArrayList 中查找某个学生的信息,通过索引访问速度很快。
      • 但是在进行频繁的插入和删除操作(尤其是在列表中间位置操作)时,效率相对较低,因为需要移动后续元素来保证顺序和连续性。示例代码如下:
        import java.util.ArrayList;
        import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Apple");  // 允许重复添加System.out.println(arrayList.get(0));  // 通过索引获取元素arrayList.remove(1);  // 删除指定索引位置的元素}
        }
    • LinkedList
      • 内部基于链表结构实现,在进行插入和删除操作时效率较高,尤其是在链表的首尾位置进行操作。例如,在实现一个队列或者栈的数据结构时,使用 LinkedList 会很方便。
      • 不过,查询效率相对 ArrayList 较低,因为要遍历链表节点来查找元素。示例代码如下:
        import java.util.LinkedList;
        import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("Dog");linkedList.add("Cat");linkedList.addFirst("Bird");  // 在链表头部添加元素linkedList.addLast("Fish");  // 在链表尾部添加元素System.out.println(linkedList.get(0));  // 通过索引获取元素}
        }

Set(集合)

  • 特点
    • 无序性:元素在 Set 中是没有特定顺序的,每次遍历元素的顺序可能都不一样,不同的实现类具体的存储顺序规则也不同。
    • 不可重复性:不允许存在重复的元素,即如果尝试添加一个已经在集合中的元素,添加操作将不会生效。
  • 常见实现类及用法
    • HashSet
      • 基于哈希表实现,添加、删除和查询操作的效率通常都比较高。它通过计算元素的哈希值来确定元素在集合中的存储位置,当两个元素的哈希值相同时,会进一步通过 equals 方法来判断是否为同一个元素。例如,存储一组学生的学号,用 HashSet 可以保证学号不会重复。示例代码如下:
        import java.util.HashSet;
        import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> hashSet = new HashSet<>();hashSet.add("Red");hashSet.add("Blue");hashSet.add("Red");  // 重复元素不会被添加System.out.println(hashSet.contains("Blue"));  // 检查元素是否存在}
        }
    • TreeSet
      • 基于红黑树实现,元素会按照自然顺序(如果元素类实现了 Comparable 接口)或者指定的比较器顺序进行排序存储,同时保证元素的不可重复性。例如,存储一组整数并希望它们自动按从小到大的顺序排列,就可以使用 TreeSet。示例代码如下:
        import java.util.Set;
        import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {Set<Integer> treeSet = new TreeSet<>();treeSet.add(5);treeSet.add(3);treeSet.add(7);for (Integer num : treeSet) {System.out.println(num);  // 元素按顺序输出}}
        }

Map(映射)

  • 特点
    • 存储键值对Map 是一种用于存储键(Key)和值(Value)的集合,每个键对应一个唯一的值,通过键可以快速查找、获取对应的的值。
    • 键的唯一性:键在同一个 Map 中是不允许重复的,如果添加重复的键,后面添加的值会覆盖前面的值。
    • 无序性(一般情况):大部分常见的 Map 实现类,如 HashMap,元素的存储顺序是不固定的,不过也有一些有序的 Map 实现类,比如 LinkedHashMap 可以保持插入顺序,TreeMap 可以按照键的顺序存储元素。
  • 常见实现类及用法
    • HashMap
      • 基于哈希表实现,提供了高效的键值对存储和检索功能,是最常用的 Map 实现类。例如,在一个学生信息管理系统中,可以用学生的学号作为键,学生对象(包含姓名、成绩等信息)作为值,方便地进行信息查询和更新。示例代码如下:
        import java.util.HashMap;
        import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, String> hashMap = new HashMap<>();hashMap.put("name", "Alice");hashMap.put("age", "20");System.out.println(hashMap.get("name"));  // 通过键获取值hashMap.put("name", "Bob");  // 覆盖之前键为"name"的值}
        }
    • LinkedHashMap
      • 继承自 HashMap,在保持了 HashMap 的高效性能的同时,还能按照插入顺序来记录键值对,方便在需要保留操作顺序的场景中使用。例如,记录用户操作的历史记录,以操作的时间戳作为键,操作详情作为值,按照操作发生的先后顺序存储在 LinkedHashMap 中。示例代码如下:
        import java.util.LinkedHashMap;
        import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, String> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("key1", "value1");linkedHashMap.put("key2", "value2");linkedHashMap.put("key3", "value3");for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}}
        }
    • TreeMap
      • 基于红黑树实现,会按照键的自然顺序(如果键的类型实现了 Comparable 接口)或者指定的比较器顺序来排列键值对,常用于需要对键进行排序查找的场景。例如,统计单词出现的频率,以单词作为键,出现次数作为值,将它们存储在 TreeMap 中,就可以按照字母顺序查看单词及对应的频率。示例代码如下:
        import java.util.Map;
        import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {Map<String, Integer> treeMap = new TreeMap<>();treeMap.put("apple", 3);treeMap.put("banana", 5);treeMap.put("cherry", 2);for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}}
        }

区别总结

比较维度ListSetMap
元素存储特点有序,可重复无序,不可重复以键值对形式存储,键唯一
主要用途适合按顺序存储、频繁通过索引访问元素的场景,如列表展示数据等用于确保元素唯一性的场景,比如去重、判断元素是否存在等用于通过键快速查找对应值的场景,如存储配置信息、映射关系等
常见实现类的查询效率对比(大致)ArrayList查询快(通过索引),LinkedList查询相对慢HashSetTreeSet查询效率都较高,TreeSet还能有序输出元素HashMap查询效率高,LinkedHashMap可保持插入顺序并查询,TreeMap按键排序后查询
常见实现类的插入 / 删除操作效率对比(大致)ArrayList中间插入 / 删除慢,首尾相对好一些;LinkedList首尾插入 / 删除快HashSet插入 / 删除效率高,TreeSet在维持排序结构下插入 / 删除相对稍慢HashMap插入 / 删除效率高,LinkedHashMap类似,TreeMap在维持排序结构下插入 / 删除相对稍慢

通过上述对 ListSetMap 的详细介绍和区别分析,可以根据具体的业务需求和性能要求,在 Java 编程中合理地选择和使用相应的集合类型。

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

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

相关文章

H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解

随着技术的不断进步和5G网络的推广&#xff0c;中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长&#xff0c;并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁&#xff0c;推动数字媒体产业的创新和发展。 EasyPla…

【 LVGL】用外部FLASH存储字库并显示

LVGL–用外部FLASH存储字库并显示 应用场景 由于使用的芯片内部FLASH空间有限&#xff0c;如果仅使用英文字库并用不了多少空间&#xff0c;但是项目需要支持中英文字库&#xff0c;中文字库添加2w字左右&#xff0c;10px大小就要1M多了&#xff0c;内部空间根本不够用&#…

含284个数据集,覆盖18项临床任务,上海AI Lab等发布多模态医疗基准GMAI-MMBench

「有这样一台智能医疗设备&#xff0c;患者只需躺在智能医疗设备上便可完成从扫描、诊断、治疗、修复的全过程&#xff0c;实现健康的重启」。这是 2013 年上映的科幻电影「极乐空间」中的一个情节。 电影《极乐空间》场景 如今&#xff0c;随着人工智能技术的飞速发展&#xf…

Java-04

目录 Redis如何实现延时队列 延时队列的组成 生产消息 消费消息 实现细节 Redis集群 Integer.compare(a[1], b[1]))与a[1] - b[1]) 设计模式​编辑 算法 Redis如何实现延时队列 使用 sortedset &#xff0c;拿时间戳作为 score &#xff0c;消息内容作为 key 调用 zad…

【C++】— 掌握STL vector 类:“Vector简介:动态数组的高效应用”

文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…

CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow

简介&#xff1a; 1.伸缩盒模型简介 2.伸缩容器、伸缩项目 3-4.主轴方向 5.主轴换行方式 6.复合属性flex-flow 7.主轴的对齐方式

互联网数字化商品管理浪潮思考:从信息化到精准运营

目录 一、商品数字化转型面临的现状分析 &#xff08;一&#xff09;运营方向分析 &#xff08;二&#xff09;商品归类分析 二、商品数字化管理建设分析 三、基础建设——商品信息数字化 &#xff08;一&#xff09;商品信息质量数字化的目的 &#xff08;二&#xff0…

STL关联式容器之RB-tree(红黑树)

AVL-tree之外&#xff0c;另一个颇具历史并被广泛运用的平衡二叉搜索树是RB-tree&#xff08;红黑树&#xff09;。所谓RB-tree&#xff0c;不仅是一颗二叉搜索树&#xff0c;而且必须满足一下规则&#xff1a; 1&#xff1a;每个节点不是红色就是黑色 2&#xff1a;根节点为…

电脑系统重装小白教程

​对于很多电脑用户来说&#xff0c;系统出现故障或者需要清理时&#xff0c;重装系统是一项不可避免的操作。但是&#xff0c;对于没有技术基础的小白用户而言&#xff0c;重装系统可能会显得复杂且困难。本文将为您提供一份简洁易懂的电脑系统重装教程&#xff0c;帮助您顺利…

使用Ollama和Open WebUI管理本地开源大模型

Open WebUI和Ollama介绍 Open WebUI 是一个功能丰富且用户友好的自托管 Web 用户界面&#xff08;WebUI&#xff09;&#xff0c;它被设计用于与大型语言模型&#xff08;LLMs&#xff09;进行交互&#xff0c;特别是那些由 Ollama 或与 OpenAI API 兼容的服务所支持的模型。O…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题&#xff0c;说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示&#xff0c;对应的VERSION信息是空的&#xff0c;在提示信息中可以看到&#xff0c;官方推荐将指纹信息上传以帮助更新服务指纹&…

向量搜索工具之 Milvus vs. Elastic

在当今数据驱动的世界中&#xff0c;向量数据库因其在处理大规模非结构化数据方面的卓越能力而变得越来越重要。随着数据量的爆炸性增长&#xff0c;如何确保这些数据库在存储和检索数十亿数据点时仍能保持高性能&#xff0c;成为了一个关键挑战。 Milvus和Elasticsearch都是管…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

每日学习记录003:(C++)unique_ptr和shared_ptr

每日学习记录003&#xff1a;&#xff08;C&#xff09;unique_ptr和shared_ptr 在C中&#xff0c;unique_ptr和shared_ptr都是智能指针&#xff0c;它们为动态内存管理提供了更安全、更方便的方式。 一、unique_ptr的特点 &#xff08;一&#xff09;独占所有权 unique_pt…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求&#xff0c;我基于canvas开发了这款图片加水印工具。 地址&#xff1a;https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 &#xff0c;轻松调整水印宽高&#xff0c;精准适配每张图…

数字化工厂 MES 成功之艰:深度剖析与探究

系统集成的复杂性 多源异构系统对接难题 在数字化工厂的建设进程中&#xff0c;MES&#xff08;制造执行系统&#xff09;处于核心枢纽地位&#xff0c;需与众多不同来源、不同架构的系统进行集成。企业内部往往早已部署了诸如企业资源计划&#xff08;ERP&#xff09;系统、…

kimi 大模型 API 接口实现大模型对话 - python 实现

kimi API接口实现大模型对话 - python 实现&#xff0c;具体代码如下&#xff1a; 注意&#xff1a;api_key 需要kimi官网注册后创建。 from openai import OpenAI if __name__ __main__:client OpenAI(api_key "sk-***********", # $MOONSHOT_API_KEY 官网注册…

服务器被隔离导致无法登录

现象描述 云服务器可能会因安全违规&#xff08;内容或行为违规&#xff09;或因 DDoS 攻击被封堵隔离&#xff0c;被隔离的云服务器在控制台显示为 “BANNING” 状态。 云服务器被隔离可能由于该台服务器违反了当前法律法规的要求。您可以通过以下方式查看该台服务器是否处于…

PaddleNLP的环境配置:

PaddleNLP的环境配置&#xff1a; conda create -n paddle—test python3.9conda activate paddle—testpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html(paddle—test) (venv) PS D:\work\论文写…

物联网研究实训室建设方案

一、引言 随着物联网技术的快速发展&#xff0c;其在各个行业的应用越来越广泛&#xff0c;对物联网专业人才的需求也日益增加。为满足这一需求&#xff0c;建设一个符合现代化教学需求的物联网研究实训室&#xff0c;对于提高学生的实践能力和创新能力具有重要意义。本方案旨…