java中Set,Map,List集合的比较(不包含增删改查函数方法)

目录

  • 1. 集合的简介
  • 2. List
  • 3. Set
  • 4. Map
  • 5. 比较
    • 5.1 结构特点
    • 5.2 实现类
    • 5.3 区别
  • 6. 其他问题
    • 6.1 集合与数组的区别
    • 6.2 哪些集合类是线程安全的
  • 7. 参考链接

1. 集合的简介

所有的集合类和集合接口都在java.util包下。

在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。

我用过的一些 Java 集合类:

  • ArrayList: 动态数组,实现了List接口,支持动态增长。
  • LinkedList: 双向链表,也实现了List接口,支持快速的插入和删除操作。
  • HashMap: 基于哈希表的Map实现,存储键值对,通过键快速查找值。
  • HashSet: 基于HashMap实现的Set集合,用于存储唯一元素。
  • TreeMap: 基于红黑树实现的有序Map集合,可以按照键的顺序进行排序。
  • LinkedHashMap: 基于哈希表和双向链表实现的Map集合,保持插入顺序或访问顺序。
  • PriorityQueue: 优先队列,可以按照比较器或元素的自然顺序进行排序。

在这里插入图片描述

2. List

List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据索引访问List中元素。 存储一组不唯一(允许重复),有序的对象。常用的实现List的类有LinkedListArrayListVectorStack

  • ArrayList是容量可变的非线程安全列表,其底层使用数组实现。当几何扩容时,会创建更大的数组,并把原数组复制到新数组。ArrayList支持对元素的快速随机访问,但插入与删除速度很慢。
  • LinkedList本质是一个双向链表,与ArrayList相比,其插入和删除速度更快,但随机访问速度更慢。

3. Set

Set不允许存在重复的元素,与List不同,set中的元素是无序的。常用的实现有HashSetLinkedHashSetTreeSet

  • HashSet通过HashMap实现,HashMapKeyHashSet存储的元素,所有Key都是用相同的Value,一个名为PRESENT的Object类型常量。使用Key保证元素唯一性,但不保证有序性。由于HashSet是HashMap实现的,因此线程不安全。
  • LinkedHashSet继承自HashSet,通过LinkedHashMap实现,使用双向链表维护元素插入顺序。
  • TreeSet通过TreeMap实现的,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。

set实现原理:Set集合通过内部的数据结构(如哈希表、红黑树等)来实现key的无重复。当向Set集合中插入元素时,会先根据元素的hashCode值来确定元素的存储位置,然后再通过equals方法来判断是否已经存在相同的元素,如果存在则不会再次插入,保证了元素的唯一性。

4. Map

Map 是一个键值对集合,存储键、值和之间的映射。Key 无序,唯一;value 不要求有序,允许重复。Map 没有继承于 Collection 接口,从 Map 集合中检索元素时,只要给出键对象,就会返回对应的值对象。主要实现有TreeMapHashMapHashTableLinkedHashMapConcurrentHashMap

  • HashMap:JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突),JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间
  • LinkedHashMapLinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
  • HashTable:数组+链表组成的,数组是 HashTable 的主体,链表则是主要为了解决哈希冲突而存在的
  • TreeMap:红黑树(自平衡的排序二叉树)
  • ConcurrentHashMapNode数组+链表+红黑树实现,线程安全的(jdk1.8以前Segment锁,1.8以后volatile + CAS 或者 synchronized)

5. 比较

5.1 结构特点

  • ListSet是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
  • List中存储的数据是有顺序的,并且值允许重复;
  • Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
  • Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

5.2 实现类

  1. List接口有三个实现类:
    1.1 LinkedList
    基于链表实现,链表内存是散列的,增删快,查找慢;
    1.2 ArrayList
    基于数组实现,非线程安全,效率高,增删慢,查找快;
    1.3 Vector
    基于数组实现,线程安全,效率低,增删慢,查找慢;

  2. Map接口有四个实现类:
    2.1 HashMap
    基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null
    键;
    2.2 HashTable
    线程安全,低效,不支持 null 值和 null 键;
    2.3 LinkedHashMap
    是 HashMap 的一个子类,保存了记录的插入顺序;
    2.4 SortMap 接口
    TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序

  3. Set接口有两个实现类:
    3.1 HashSet
    底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法;
    3.2 LinkedHashSet
    继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap

5.3 区别

  1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素。
  2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 TreeSet 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator<Type >接口来自定义排序方式。

6. 其他问题

6.1 集合与数组的区别

  • 数组是固定长度的数据结构,一旦创建长度就无法改变,而集合是动态长度的数据结构,可以根据需要动态增加或减少元素。
  • 数组可以包含基本数据类型和对象,而集合只能包含对象。
  • 数组可以直接访问元素,而集合需要通过迭代器或其他方法访问元素。

6.2 哪些集合类是线程安全的

  • Vector:就比Arraylist多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使用。
  • HashTable:就比hashMap多了个synchronized (线程安全),不建议使用。
  • ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现。它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构;一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素;每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。(推荐使用)

7. 参考链接

List、Map、Set的区别与联系
Java【集合面试题】

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

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

相关文章

C++加载sqlite3数据库文件

db数据库文件简单轻便&#xff0c;形式上可以像excel数据那样&#xff0c;但是解析的时候却有很大的灵活性。使用Python解析db数据已经是很简单的事情&#xff0c;使用专门的数据库可视化工具&#xff0c;通过sql语句查询内容也是有手就行&#xff0c;也许C也不难&#xff0c;但…

31省226地级市极端天气和气候风险指数 (1993-2023年)附下载链接

1993-2023年31省、226个地级市极端天气和气候风险指数 下载链接-点它&#x1f449;&#x1f449;&#xff1a;1993-2023年31省、226个地级市极端天气和气候风险指数-最新出炉.zip 数据名称 1993&#xff5e;2023 省市级气候风险指数 数据来源 nature 子刊&#xff0c;已转…

DEPT:DECOMPOSED PROMPT TUNING FOR PARAMETER-EFFICIENT FINE-TUNING

论文汇总 当前的问题 (1)Prompt Tuning通常收敛缓慢&#xff0c;并且对初始化敏感&#xff1b; (2)Prompt Tuning延长了输入序列的总长度&#xff0c;从而加剧了计算需求(即训练/推理时间和内存成本)&#xff0c;这是由于Transformer的二次复杂度(Vaswani et al, 2017)。 解…

鸿蒙开发:实现全局异常捕获和异常查看

前言 开发中的异常信息&#xff0c;我们很容易排查&#xff0c;直接可以在控制台中就可以查看&#xff0c;但是&#xff0c;提交给测试同学或者上线后的异常信息&#xff0c;我们如何获取呢&#xff1f;这里我们很容易想起&#xff0c;三方sdk&#xff0c;比如常见的腾讯Bugly…

基于Springboot+Vue的学校课程管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

vue之打包配置环境

一直以来都是用脚手架直接搭建的项目,也很少去深究,前两天因为环境配置变更,稍微研究了下 NODE_ENV 首先 在evn.xxx 的配置文件里 一定要有的NODE_ENV NODE_ENV 默认只有两种状态即development和production development: 指代本地开发即localhost环境&#xff08;本地的开发…

VirtualBox虚拟机桥接模式固定ip详解

VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式&#xff1f;桥接模式可以实现物理机和虚拟机互相通信&#xff0c;虚拟机也可以访问互联网&#xff08;推荐万金油&#xff09;&#xff0c;物…

2020款Macbook Pro A2251无法充电无法开机定位及修复

问题背景 up主有一台2020年的Macbook Pro&#xff0c;带Touch Bar&#xff0c;16G512G&#xff0c;四核I5&#xff0c;型号A2251 应该是一周没充电了&#xff0c;之前还用的好好的&#xff0c;后来有一天出差想带上 打开没电&#xff0c;手头上有个小米的66W快充头&#xff0c…

LeetCode常用算法模板

代码模板 1、DFS&#xff1a;适用于树和图的遍历、组合问题。 2、BFS&#xff1a;适用于树和图的层次遍历、最短路径问题。 3、二分查找&#xff1a;适用于有序数组的搜索问题。 4、动态规划&#xff1a;适用于最优化问题、序列问题。 5、贪心算法&#xff1a;适用于局部最优问…

(二)Windows通过vs c++编译PaddleOCR-2.8.1

编译环境 操作系统&#xff1a;windows 11 paddleOCR版本&#xff1a;2.8.1 opencv版本&#xff1a;4.10.0 cmake版本&#xff1a;3.22.6 git版本&#xff1a;2.47.0 visual statio版本&#xff1a;VS 2022 Community&#xff08;选择社区版本即可&#xff0c;安装时记得…

python离线安装依赖

以pymsql依赖为例操作如下: Python Package Index&#xff08;PyPI&#xff09;的官方网址是&#xff1a; PyPI The Python Package Index 在这个网站上&#xff0c;你可以搜索、浏览和下载Python包。 tar -xvzf pymysql2-1.3.3.tar.gz cd pymysql2-1.3.3 python setup.p…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…

文生图的底层逻辑比你想象中简单!从大语言模型到大型多模态模型的演进与展望

2024年8月15日&#xff0c;来自浙江农林大学&#xff08;数学与计算机科学学院&#xff09;冯海林团队在CMC期刊发表名为“Evolution and Prospects of Foundation Models: From Large Language Models to Large Multimodal Models”的文章。在这篇文章中&#xff0c;研究团队首…

铲屎官们快来交作业!双十一性价比高的宠物空气净化器求推荐?

好不容易等到一年一度的双十一&#xff0c;这个购物狂欢节我肯定不能错过。除了自己买买买外&#xff0c;还准备给我家小猫也买个礼物。之前听说宠物空气净化器对养宠家庭作用很大&#xff0c;打算趁活动拿下。 不看不知道&#xff0c;一看吓一跳&#xff0c;有点太贵了吧&…

【SoC】被忽略的reset结构设计

1024这天爆出来的设计失误&#xff0c;真的很应景啦&#xff01; 先献上A72的reset结构图吧&#xff0c;虽然最终的解决方案不是按照这个来的&#xff0c;不过也给了一个相对较清晰的reset架构了。 异步复位树 当对整个电路进行复位的时候&#xff0c;使用异步复位&#xff0c…

spark统一内存模型 详解

Apache Spark 是一个用于大规模数据处理的分布式计算框架&#xff0c;它支持多种处理模型&#xff08;如批处理、流处理、SQL、机器学习等&#xff09;。为了高效地在分布式环境中处理这些多样化的工作负载&#xff0c;Spark 在 2.x 版本后引入了统一内存管理模型&#xff0c;以…

【实战项目】——Boost搜索引擎(五万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、项目的相关背景 1.1、什么是Boost库&#xff1f; 1.2、什么是搜索引擎&#xff1f; 1.3、为什么要做Boost库搜索引擎&#xff1f; 二、搜索引擎的宏观原…

生产小工单如何轻松实现生产任务敏捷管理的?

在现代生产任务制造业中&#xff0c;有效管理生产是提升效率的关键。生产管理系统中的生产小工单管理&#xff0c;是解决传统生产管理痛点的重要工具。本文将深入探讨生产小工单的概念、流程及其主要功能。 下面我会用一个实际的生产工单系统为例&#xff0c;给大家详细介绍下…

苍穹外卖--开发记录day12(完结篇)

目录 苍穹外卖day12一&#xff1a;工作台二&#xff1a;apachePOI三&#xff1a;导出excel报表&#xff08;最后一个功能&#xff01;&#xff01;&#xff09; 总结&#xff08;项目完结心得&#xff09; 苍穹外卖day12 一&#xff1a;工作台 代码导入之后就是这样的效果&…

Java 虚拟机(JVM)中的内存泄漏排查技巧及各种内存查看命令分析工具推荐

文章目录 引言什么是内存泄漏&#xff1f;工具和技术1. 使用 jstat 监控 JVM2. 使用 jmap 生成堆转储文件3. 使用 jvisualvm 分析堆转储文件4. 使用 MAT&#xff08;Memory Analyzer Tool&#xff09;5. 使用 YourKit 或 JProfiler6. 代码审查和静态分析 实战案例案例 1&#x…