【java】java集合详解

news2024/12/28 19:39:13

目录

  • 一.集合类型
  • 二.集合的不同
  • 三.List解析
    • 1.ArrayList
    • 2.LinkedList
    • 3.Vector
  • 四.Set解析
    • 1.HashSet
    • 2.TreeSet
    • 3.LinkedHashSet
  • 五.Map解析
    • 1.HashMap
    • 2.TreeMap
    • 3.HashTable
    • 4.ConcurrentHashMap

一.集合类型

集合类型和关系(我画的比较简略,其中有很多继承实现关系都没有画),如下图

在这里插入图片描述

二.集合的不同

集合类型元素是否重复元素是否有序
List(单列集合)可重复有序
Set(单列集合)不可重复无序
Map(双列集合)K不可重复,V可重复有序

三.List解析

1.ArrayList

ArrayList底层是数组。
查询:因为数组结构是连续的空间,可以迅速根据数组下标找到元素,所以ArrayList查询比较快。
增删:因为增加一个新元素,数组会复制一个新数组,把新增元素和之前元素放进去,删除也是数组元素会移动,所以速度比较慢。
线程异步。

 //默认初始容量为10
private static final int DEFAULT_CAPACITY = 10;
//指定ArrayList容量为0时,返回该空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//没有指定容量时,默认返回该空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//该数组保存添加到ArrayList里的元素
transient Object[] elementData;

/**
 * ArrayList有参构造器
 */
public ArrayList(int initialCapacity) {
    //指定容量则创建对应容量数组
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        //指定容量为0返回 EMPTY_ELEMENTDATA
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
    }
 }

/**
 * ArrayList无参构造器
 */
public ArrayList() {
    //未指定容量返回 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

2.LinkedList

LinkedList底层是链表。
查询:因为链表不是连续的地址,是一个节点和一个节点连接到一起,所以查询比较慢,因为每次都需要重头开始查找,所以查询速度比较慢。
增删:因为增删会直接让节点相连或者断掉节点,对整体没有影响,所以增删速度比较快。
线程异步。

transient int size = 0;   //LinkedList中存放的元素个数

    transient Node<E> first;  //头节点
    
    transient Node<E> last;   //尾节点

	 //构造方法,创建一个空的列表
    public LinkedList() {
    }

    //将一个指定的集合添加到LinkedList中,先完成初始化,在调用添加操作
    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

3.Vector

Vector底层是数组。因为是线程同步的,某一时刻只能有一个线程访问Vector,所以速度比较慢,ArrayList就是用来替代Vector集合的。
线程同步(方法加了synchronized关键字保证线程同步)。

四.Set解析

1.HashSet

HashSet底层是哈希表,就是实现了HashMap。
初始:哈希表 = 数组 + 链表
当长度大于8并且数组长度大于64,哈希表 = 数组 + 红黑树
当长度大于8并且数组长度小于64,哈希表会扩容
当红黑树的节点等于小于6的时候 ,哈希表 = 数组 + 链表

存取元素:HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。

    //初始化一个HashMap,实现HashSet。
    private transient HashMap<E,Object> map;
    
    //new一个不可变对象
    private static final Object PRESENT = new Object();

    //构造方法就是new一个HashMap
    public HashSet() {
        map = new HashMap<>();
    }
    
    //新增的时候就是把元素放到K中,所以不能重复,而V中放的是不可变的对象
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

2.TreeSet

TreeSet底层是红黑树(是一种特殊的二叉树),就是实现了TreeMap。

新增原理:
1.TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
2. Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自 己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。

3.LinkedHashSet

LinkedHashSet是HashSet的子类,它是有序的,因为包含了两个链表,一个链表记录数据,一个链表记录元素的位置,所以是有序的。

五.Map解析

这里简单介绍,后面我会出一篇详细的map介绍。 键值对(Key-Value)结构

1.HashMap

线程异步(线程不安全),底层是哈希表。
K不能重复,V可重复。
K和V都可以为Null。

2.TreeMap

底层是红黑树。
K不能重复,V可重复。

3.HashTable

线程同步(线程安全),底层是哈希表。
K不能重复,V可重复。
K和V都不能为Null。

4.ConcurrentHashMap

线程同步(线程安全),底层是哈希表。
ConcurrentHashMap本质上是一个HashMap,因此功能和HashMap是一样的,但是ConcurrentHashMap在HashMap的基础上提供了并发安全的一个实现。并发安全的主要实现主要通过对于Node节点去加锁,来保证数据更新的安全性。

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

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

相关文章

Web入门开发【三】- 准备工作

欢迎来到霍大侠的小院&#xff0c;我们来学习Web入门开发的系列课程。 首先我们来了解下这个课程能学到什么&#xff1f; 1、你将可以掌握Web网站的开发全过程。 2、了解基础的HTML&#xff0c;CSS&#xff0c;JavaScript语言。 3、开发自己的第一个网站。 4、认识很多对编…

刷爆力扣之字符串转换整数(atoi)

刷爆力扣之字符串转换整数(atoi) HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&a…

1、移动端基础

目录1、常见浏览器PC端移动端2、手机屏幕3、移动端调试方法4、视口4.1 布局视口 layout viewport4.2 视觉视口visual viewport4.3 理想视口 idea viewport **meta视口标签5、二倍图1、物理像素和物理像素比6、多倍图7 背景缩放background-size移动端背景图展示8、移动端主流方案…

IDEA创建kotlin项目

今天新建了一个kotlin项目&#xff0c;竟然不能导入jar包&#xff0c;原因是新建项目的时候&#xff0c;选择了kotlin作为Gradle的开发语音&#xff0c;kotlin语音里面&#xff0c;下面这行配置识别不了&#xff1a; implementation fileTree(dir: libs, include: [*.jar])所以…

【蓝桥杯】第10届Scratch国赛第6题程序2 -- 捉迷藏

[导读]&#xff1a;蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事。蓝桥杯大赛首席专家倪光南院士说&#xff1a;“蓝桥杯以考促学&#xff0c;塑造了领跑全国的人才培养选拨模式&#xff0c;并获得了行业的深度认可。” 春雷课堂计划推出Scratch蓝桥杯…

青龙面板搭建+QQ机器人

搭建青龙面板首先有个服务器 我这里看到华为云有活动就入手了一个 1.系统选择 centos7.9 华为云购买地址&#xff1a;https://activity.huaweicloud.com/1212_promotion/index.html 2. 服务器上安装宝塔 yum install -y wget && wget -O install.sh http://downl…

340页11万字智慧政务大数据资源平台数据治理方案

一.1.1 数据治理子系统 建设大数据治理子平台&#xff0c;提供数据标准管理、元数据管理、数据质量管理能力&#xff0c;实现对数据的规范治理与管理&#xff1b;提供数据工厂能力&#xff0c;实现对归集的数据进行清洗、加工&#xff0c;支撑业务的数据应用需求。具体&#xf…

ES6 箭头函数 Arrow Function

前言 1. ES6 前定义函数 2. ES6 箭头函数语法 3. ES6 箭头函数返回值 4. 箭头函数中的 this 到底是谁 ? 前言 ES6 新增了一种新的函数: 箭头函数 Arrow Function 箭头函数相当于匿名函数&#xff0c;简化了函数定义&#xff0c;将原函数的 function 关键字和函数名都删掉&am…

学习.NET MAUI Blazor(三)、创建.NET MAUI Blazor应用并使用AntDesignBlazor

大致了解了Blazor和MAUI之后&#xff0c;尝试创建一个.NET MAUI Blazor应用。 需要注意的是&#xff1a; 虽然都叫MAUI&#xff0c;但.NET MAUI与.NET MAUI Blazor 并不相同&#xff0c;MAUI还是以xaml为主&#xff0c;而MAUI Blazor则是以razor为主。 这个系列还是以MAUI Bla…

23. 【gRPC系列学习】gRPC安全认证-JWT认证

JWT 即 JSON Web Token,是用 JSON 形式安全传输信息的方法。本节介绍JWT与gRPC结合,关于JWT交互流程的介绍参考文末的链接。 1. 使用JWT客户端与服务端交互 1)客户端使用用户名、密码发送给服务端 2)服务端返回JWT数据,返回数据由三部分组成 Header:TOKEN 的类型,就是JW…

截至2022年12月共计451个信息安全国家标准 汇总

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

二本跨专业自学编程及程序员就业之路——20W社招进银行

自学编程的道路 先做个自我介绍&#xff0c;我是一名普通二本院校的学生。在广州上学&#xff0c;21年毕业&#xff0c;非科班出身。上大学之前&#xff0c;很少接触电脑&#xff0c;连QQ都是别人送我的&#xff0c;当时还开心了好一阵子。 大学的时候&#xff0c;开始接触的第…

对美国学校制度的一点儿思考

本文作者在美国生活了几十年&#xff0c;随着对这个国家的深入了解&#xff0c;发现原来对美国的一些认知上有偏差。所以其根据在美的所见所闻&#xff0c;结合中国国内的情况&#xff0c;做了分析对照&#xff0c;在此知识人网小编仅摘录关于美国学校制度的内容以飨读者。 美国…

喜报 | 知道创宇ZoomEye Pro获评ISC 2022创新能力百强,实力入选“攻击面与资产管理领域”创新产品榜单!

12月21日&#xff0c;ISC 2022数字安全创新能力百强颁奖典礼在北京举行。 知道创宇的 ZoomEye Pro 以其先进的网络安全技术和创新产品能力&#xff0c;通过层层筛选&#xff0c;从众多产品中脱颖而出&#xff0c;入选“攻击面与资产管理领域”的创新产品榜单&#xff01;知道创…

IDEA运行缓慢,闪退解决方式——增加堆内存

目录方法一&#xff1a;通过IDE修改配置方法二&#xff1a;使用ToolBox进行设置方法三&#xff1a;直接修改vmoptions文件如果遇到速度变慢的情况&#xff0c;可能需要增加内存堆。方法一&#xff1a;通过IDE修改配置 help–>Change Memory Setting–>修改为一个合适的值…

机器学习算法基础——决策树

文章目录决策树算法的定义发展历程适用范围及其优缺点适用范围优点缺点代码实现决策树算法的定义 决策树&#xff08;Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来求取净现值的期望值大于等于零的概率&#xff0c;评价项目风险&…

系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?

系统设计场景题—MySQL使用InnoDB&#xff0c;通过二级索引查第K大的数&#xff0c;时间复杂度是多少&#xff1f;前言明确场景对齐表的结构分析时间复杂度执行一条 select 语句&#xff0c;期间发生了什么&#xff1f;分析性能的瓶颈如何做出优化一、从业务上绕过二、使用覆盖…

史上最强人工智能ChatGPT 到底有多强?

ChatGPT 已经踏上了它的成神之路&#xff0c;这绝对是我所用过的&#xff0c;我相信也是你用过的&#xff0c;最让人震撼的人工智能产品&#xff0c;比起 AI 画画&#xff0c;它甚至更具颠覆性。只用短短十分钟&#xff0c;它就耗尽了我毕生所学的感叹词&#xff0c;最后只留下…

I2S和I2C分别如何连接pad

GPIO一共有8种输入输出模式。可参考&#xff1a; GPIO内部结构和各种模式_cy413026的博客-CSDN博客读了该篇文章可以知道&#xff1a;1.gpio可以直接用cpu通过寄存器控制读写2.可以直接与片内外设连接 受外设控制(I2C)3.gpio的push-pull和OD/OC结构4.上下拉在输入输出的使用5.…

微信小程序之实时聊天系统——页面介绍

目录 系统结果展示&#xff1a; 系统的页面说明&#xff1a; 1.我们首先再app.json中创建四个tabBar页面&#xff08;消息、联系人、用户列表、我的&#xff09; 2.消息页面&#xff1a; 3.联系人页面&#xff1a; 4.用户列表页面&#xff1a; 5.我的页面&#xff1a; 欢…