常用集合List、Set、Map的比较

2023-05-16

概述:

  • List、Set、Map都是接口,前两个继承至Collection接口,Map为独立接口。
    在这里插入图片描述

List有序,可重复

1.ArrayList

底层:数组;查询快,增删慢。
线程不安全,效率高。
getter()、setter()方法快
当容量不够时,扩展当前容量*1.5+1

注意: 谨慎使用subList方法。
subList返回的是ArrayList的内部类,数据是原ArrayList的视图,改动subList的返回值会对元数据产生变动。
代替方法:

list.stream().skip(strart).limit(end).collect(Collectors.toList());

2.Vector

底层:数组;查询慢,增删慢。
线程安全,效率低。
当容量不够时,默认扩展一倍

3.LinkedList

底层:链表;查询慢,增删快。
线程不安全,效率高。

4.CopyOnWriteArrayList

并发情况下,读场景远远大于写场景的时候使用;
他的写场景会复制一份相同的数组去写,读写互不干扰,所有读更快。

Set无序,唯一性

1.HashSet

底层:哈希表;存取速度快
依赖hashCode()、equals()保证唯一性。

注意:内部的实现原理实际用到的是HashMap;

2.LinkedHashSet

底层:链表和哈希表
元素有序:链表;
唯一性:哈希表。

3.TreeSet

底层:红黑树
元素有序:自然排序、比较器排序
唯一性:根据比较的返回值是否为0。
            HashSet<String> hashSet = new HashSet<>();
            LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
            TreeSet<String> treeSet = new TreeSet<>();

            for (String data : Arrays.asList("1", "2", "4", "-5", "3")) {
                hashSet.add(data);
                linkedHashSet.add(data);
                treeSet.add(data);
            }

            //HashSet不一定有序
            System.out.println("HashSet :" + hashSet);

            //LinkedHashSet按照插入顺序排序(FIFO)
            System.out.println("LinkedHashSet :" + linkedHashSet);

            //Tree内部实现排序
            System.out.println("TreeSet :" + treeSet);

Set中三个实现类是否有序的结果:

HashSet :[1, 2, 3, 4, -5]
LinkedHashSet :[1, 2, 4, -5, 3]
TreeSet :[-5, 1, 2, 3, 4]

Map概述

Map接口有HashMap、TreeMap、HashTable三个实现类

1.HashMap

键不可重复,值可重复,无序
底层:哈希表
线程不安全,效率高
当空间占用比例超过0.75,扩容变为原来的2倍
允许key值为null,value为null

推荐: 在不用考虑线程安全的情况下使用

2.HashTable

键不可重复,值可重复,无序
底层:哈希表
线程安全,效率低,全程sychronized同步锁

3.TreeMap

底层:二叉树,有序的
键不可重复,值可重复

4.ConcurrentHashMap

线程安全且高效的,jdk1.7使用segment分段锁机制,jdk1.8使用cas无锁机制,锁的粒度更细了.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用集合List、Set、Map的比较 的相关文章

随机推荐

  • web前端播放视频基础(多种格式,mp4, ogg, flv)(普通项目和vue项目)

    前端播放视频 满足一般播放条件 话不多说 先上代码 以下包含我能做出来可以做出来播放的视频格式 测试ok 可能还有ogg和wmv的格式可以播放 但我没测试通过 所以不展示 span class token keyword if span s
  • javascript中正则匹配多个条件, 常用正则匹配, 正则详解

    javascript中正则匹配多个条件 常用正则匹配 正则表达式常用方法实现其他的常用正则匹配详解 注意 本篇文章是根据在下日常编码过程中逐渐丰富的 越往后看 收获越丰富 收藏起来以后随时回顾 准备工作 1 汉字和unicode码的在线转换
  • antd react ProTable 基本使用

    antd react pro系列 ProTable 基本使用 一 安装二 常用字段 antd 全称 Ant Design 是目前来说运用最广泛的 react 的 ui 框架 下文就用略写 antd 代替了 pro系列不做过多解释 毕竟ui框
  • canvas插件 fabric.js 使用

    fabric js使用 fabric js 是 常用的 canvas 插件1 在项目中使用2 特殊用法 基本设置 画板数据的导入导出 遮罩 Pattern 引用官网案例 多个对象合并 并设置为 fabric 背景 适用于变色和更多场景 把
  • 前端 百度地图 javascript api 在线地图, 离线地图

    前端 百度地图 javascript api 在线地图 离线地图 在线地图登录百度api获取key注册为个人开发者后 创建应用 离线地图 瓦片地图 下载离线瓦片地图二 下载api js 一些常用api难找见的api 在线地图 在线地图 百度
  • 基于 jquery imagesloaded masonry 实现的瀑布流图片展示

    基于 jquery imagesloaded masonry 实现的瀑布流图片展示 基于 jquery imagesloaded masonry 实现的瀑布流图片展示简述 xff0c 版本 xff0c 及插件案例htmlcssjs 基于 j
  • 微信小程序开发双重for循环, wx: if else 语法

    微信小程序开发 双重for循环 多重for循环 重点在于 wx for item 61 34 problemItem 34 和 wx for index 61 34 idx 34 确定循环的 item 和index 理论上可以实现无上线条循
  • react hocks ggeditor 脑图开发(双向细目表), 实用技巧

    ggeditor脑图开发 目录 配置说明api介绍 xff0c 引入插件 xff0c 获取api xff08 withPropsAPI xff09 xff0c 获取node api xff0c 常用api汇总 xff0c 绑定事件功能实现
  • TX2开发板CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed.

    因为之前已经cmake过 把之前cmake生成的build目录中的文件 xff0c 以及opencv目录下生成的CmakeCache txt删除就可以解决了
  • 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1 可以刷成电视 43 游戏盒子的双系统 也可以刷成单独的电视盒子和游戏盒子 不过因为内存有限放不了多少游戏 还是建议用外置SD卡存储游戏比较合适 2 刷成Armbian linux系统 xff08 可以实现docker 可
  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢