Java基础_集合类_List

List

  • Collection、List接口
    • 1、继承结构
    • 2、方法
  • Collection实现类
    • 1、继承结构
    • 2、相关类
      • (1)AbstractCollection
      • (2)AbstractList
        • AbstractSequentialList(子类)
      • 其它接口
        • RandomAccess【java.util】
        • Cloneable【java.lang】
        • Serializable【java.io】
  • 具体实现类
    • 1、Vector
      • Stack
    • 2、ArrayList
    • 3、LinkedList
      • Deque接口(子接口)
        • Queue接口(父接口)
      • 源码分析
    • 4、CopyOnWriteArrayList【COW并发容器,写时复制容器<读写分离>】

Collection、List接口

1、继承结构

在这里插入图片描述

2、方法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Collection实现类

1、继承结构

在这里插入图片描述
类图:
在这里插入图片描述

2、相关类

(1)AbstractCollection

Collection接口的骨架式实现类,最小化实现Collection接口的代价。

(2)AbstractList

List接口的骨架式实现类,最小化实现List接口的代价。**“随机访问”**数据存储。

提供了iterator()、listIterator()方法的实现。

重要属性
protected transient int modCount;【修改次数,迭代器和列表迭代器使用】
如果该字段的值发生意外变化,迭代器(或列表迭代器)将抛出ConcurrentModificationException,以响应next、remove、previous、set、add操作。这提供了快速故障行为,而不是在迭代期间面对并发修改时的不确定性行为。

AbstractSequentialList(子类)

List接口的框架实现,**“顺序访问”**数据存储。

其它接口

RandomAccess【java.util】


List实现使用的标记接口,表明它们支持快速随机访问(通常是常量时间)

该接口的主要目的是允许泛型算法改变其行为,以便在应用于随机或顺序访问列表时提供良好的性能。

操作随机访问列表(如ArrayList)的最佳算法在应用于顺序访问列表(如LinkedList)时可以产生二次行为。鼓励泛型列表算法在应用算法之前检查给定列表是否是该接口的实例。

Cloneable【java.lang】

标记接口
一个类实现了Cloneable接口,表明调用Object.clone()方法对该类的实例进行逐个字段的复制是合法的。在没有实现Cloneable接口的实例上调用Object的clone方法将导致抛出CloneNotSupportedException异常。

按照约定,实现这个接口的类应该重写Object.clone()方法,表明是public,而Object.clone()方法是protected

这个接口不包含clone方法。因此,不可能仅仅因为对象实现了这个接口就克隆它。即使以反射方式调用clone方法,也不能保证它一定会成功。

Serializable【java.io】

标记接口。Serializable接口没有方法或字段,仅用于标识可序列化的语义。

具体实现类

1、Vector

在这里插入图片描述
在这里插入图片描述

  • 可增长的对象数组,使用索引访问:capacitycapacityIncremnt

Stack

继承自Vector类,扩展Vector类实现LIFO功能:

  • push、pop
  • peek
  • search
  • empty

LIFO功能:
在这里插入图片描述

2、ArrayList

在这里插入图片描述
List接口的可调整数组实现。

不同步

  • Collections.synchronizedList(new ArrayList(…));

实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(大致相当于Vector,但不同步。)

  • Cloneable:Object.clone()

  • Iterable:forEach(Consumer<? super E> action)

  • Collection:removeIf(Predicate<? super E> filter)

  • AbstractList:removeRange(int fromIndex, int toIndex)

  • 增加方法:

    • ensureCapacity(int minCapacity)
    • trimToSize()
      时间复杂度:
  • size、isEmpty、get、set、iterator和listIterator操作在常量时间内运行。

  • add在平摊常数时间内运行,即添加n个元素需要O(n)时间。

  • 所有其他操作都在线性时间内运行(粗略地说)。

与LinkedList实现相比,常数因子较低

每个ArrayList实例都有一个capacity,用于存储列表中元素的数组的大小。它总是至少和列表大小一样大。当元素被添加到ArrayList中时,它的容量会自动增长。
在添加大量元素之前使用ensureCapacity操作来增加ArrayList实例的容量。这可能会减少增量再分配的数量。

分析源码
(1)构造函数

//存储数据:Object数组elementData//构造函数(空参):赋值空数组
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}/*构造函数(含参:容器大小):判断initialCapacity > 0:创建对应大小的一个Object数组;= 0 :赋值一个空数组
*/
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {// 空数组this.elementData = EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "+                                         initialCapacity);}
}/*构造函数(使用集合Collection的子类对象)
*/
public ArrayList(Collection<? extends E> c) {//将参数转换成数组Object[] a = c.toArray();//数组长度不为0//参数类型判断:ArrayList直接赋值;Arrays.copyOf()方法拷贝if ((size = a.length) != 0) {if (c.getClass() == ArrayList.class) {elementData = a;} else {elementData = Arrays.copyOf(a, size, Object[].class);}} else {//转换的数组长度为0:赋值空数组 elementData = EMPTY_ELEMENTDATA;}
}

(2)数组大小扩展

	// 减少不必要的空间消耗public void trimToSize() {//处理数++modCount++;//容器中元素个数 VS 存储数据数组长度 if (size < elementData.length) {//容器空 ? 空数组 : Arrays.copyOf()elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);}}public void ensureCapacity(int minCapacity) {//minCapacity>底层数组长度【需要扩容】//!(底层数组不空 && minCapacity<=10)【底层数组空:第一次】if (minCapacity > elementData.length&& !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA && minCapacity <= DEFAULT_CAPACITY)) {//操作数++modCount++;//增加grow(minCapacity);}}private Object[] grow(int minCapacity) {int oldCapacity = elementData.length;if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {int newCapacity = ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity, /* minimum growth */oldCapacity >> 1           /* preferred growth */);return elementData = Arrays.copyOf(elementData, newCapacity);} else {return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];}}private Object[] grow() {return grow(size + 1);}

(3)代码

ArrayList<String> al = new ArrayList<>();
al.add("hello");

构造函数:创建一个空数组
在这里插入图片描述
add()方法:【底层:空数组】=>扩容到长度为DEFAULT_CAPACITY(10)的数组
在这里插入图片描述
假设当前底层数组中已经添加了10个元素,现在继续调用add()添加一个元素:数组扩容1.5倍
在这里插入图片描述

3、LinkedList

在这里插入图片描述

Deque接口(子接口)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Queue接口(父接口)

在这里插入图片描述
在这里插入图片描述

源码分析

(1)双向链表

    private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}transient int size = 0;transient Node<E> first;transient Node<E> last;//构造函数public LinkedList() {}

(2)add方法

	public boolean add(E e) {linkLast(e);return true;}void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}

在这里插入图片描述

4、CopyOnWriteArrayList【COW并发容器,写时复制容器<读写分离>】

在这里插入图片描述
在这里插入图片描述

底层:Object数组
在这里插入图片描述

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

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

相关文章

Kafka学习笔记01【2024最新版】

一、Kafka-课程介绍 官网地址&#xff1a;Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ kafka 3.6.1版本&#xff0c;作为经典分布式订阅、发布的消息传输中间件&#xff0c;kafka在实时数据处理、消息队列、流处理等领域具有广泛…

容器安全-镜像扫描

前言 容器镜像安全是云原生应用交付安全的重要一环&#xff0c;对上传的容器镜像进行及时安全扫描&#xff0c;并基于扫描结果选择阻断应用部署&#xff0c;可有效降低生产环境漏洞风险。容器安全面临的风险有&#xff1a;镜像风险、镜像仓库风险、编排工具风险&#xff0c;小…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…

python中如何用matplotlib写雷达图

#代码 import numpy as np # import matplotlib as plt # from matplotlib import pyplot as plt import matplotlib.pyplot as pltplt.rcParams[font.sans-serif].insert(0, SimHei) plt.rcParams[axes.unicode_minus] Falselabels np.array([速度, 力量, 经验, 防守, 发球…

新科技辅助器具赋能视障生活:让盲人出行融入日常

随着科技日新月异的发展&#xff0c;一款名为蝙蝠避障专为改善盲人日常生活的盲人日常生活辅助器具应运而生&#xff0c;它通过巧妙整合实时避障与拍照识别功能&#xff0c;成功改变了盲人朋友们的生活格局&#xff0c;为他们提供了更为便捷、高效的生活体验。 这款非同…

注意力机制:SENet详解

SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;是2017年提出的一种经典的通道注意力机制&#xff0c;这种注意力可以让网络更加专注于一些重要的featuremap&#xff0c;它通过对特征通道间的相关性进行建模&#xff0c;把重要的特征图进行强化来提升模型的性能…

【Redis 开发】Redisson

Redisson RedissonRedisson分布式锁Redisson可重入锁Redission解决超时释放的问题Redission解决锁的判断一次性问题Redission分布式锁主从一致性问题 Redisson Redisson是一个在Redis的基础上实现的java驻内存数据网格&#xff0c;就是提供了一系列的分布式的java对象 官方地址…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈&#xff0c;可实现网络数据包和串口数据的双向透明传输&#xff0c;具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式&#xff0c;串口波特率最高可支持到…

BUUCTF-WEB2

[SUCTF 2019]EasySQL1 1.启动靶机 2.寻找注入点和注入方法 随便输入一个字母&#xff0c;没有回显 随便输入一个数字&#xff0c;发现有回显&#xff0c;并且回显结果一样 3.堆叠注入 1; show databases; #查看数据库 1; show tables; #查看数据表 里面有个flag 1;set …

图像处理ASIC设计方法 笔记19 连通域标记ASIC系统设计

目录 核心的模块有:标记ASIC的工作流程如下:该芯片的系统结构具有如下特点:P131 第6章 连通域标记与轮廓跟踪 本章节讲述了多值分割图像连通域标记芯片的系统设计 多值分割图像连通域标记芯片(以下简称"标记芯片",也称"标记 ASIC"),完成图像连通域标…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流&#xff0c;并设置成循环推流&#xff0c;此时需要使用参数stream_loop&#xff0c;命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

视频号小店要交多少保证金?这里面的秘密,全网无人敢说!

大家好&#xff0c;我是电商糖果 关于视频号小店的保证金的问题&#xff0c;有不少人询问过糖果。 这毕竟是个新平台&#xff0c;很多人对于它的收费标准不太清楚。 糖果做视频号小店一年多了&#xff0c;也开了多家小店。 下面就来给大家详细的说一下。 首先&#xff0c;我…

鸿蒙官网学习3

鸿蒙官网学习3 每日小提示项目的模块类型跨设备预览调试阶段应用的替换方式有两种 打开老的demo工程报错UIAbility 每日小提示 项目的模块类型 moduleType分为三种&#xff0c;只有1&#xff0c;2的模块支持直接调试和运行 entryfeaturehar 跨设备预览 需要手动在config.j…

Java微服务架构之Spring Boot —上篇

SpringBoot 概述 SpringBoot提供了一种快速使用Spring的方式&#xff0c;基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置与逻辑业务之间进行思维的切换&#xff0c;全身心的投入到逻辑业务的代码编写中&#xff0c;从而大大提高了开发的效率&#xff0c;一定程度…

Swift - 基础语法

文章目录 Swift - 基础语法1. 常量1.1 只能赋值1次1.2 它的值不要求在编译时期确定&#xff0c;但使用之前必须赋值1次1.3 常量、变量在初始化之前&#xff0c;都不能使用 2. 标识符3. 常用数据类型4. 字面量4.1 布尔4.2 字符串4.3 整数4.4 浮点数4.5 数组4.6 字典 5. 类型转换…

【MySQL关系型数据库】基本命令、配置、连接池

目录 MySQL数据库 第一章 1、什么是数据库 2、数据库分类 3、不同数据库的特点 4、MySQL常见命令&#xff1a; 5、MySQL基本语法 第二章 1、MySQL的常见数据类型 1、数值类型 2、字符类型 3、时间日期类型 2、SQL语句分类 1、DDL&#xff08;数据定义语言&#x…

Qt设置可执行程序图标,并打包发布

一、设置图标 图标png转ico: https://www.toolhelper.cn/Image/ImageToIco设置可执行程序图标 修改可执行程序图标 添加一个rc文件,操作如下,记得后缀改为rc 打开logo.rc文件添加代码IDI_ICON1 ICON DISCARDABLE "logo.ico"在项目pro后缀名的文件中添加代码 RC_…

一套Java语言开发的(药物不良反应智能监测ADR成品源码)B/S架构:用于监测和收集药品在使用过程中发生的不良反应的系统

药品不良反应监测工作弥补了药品上市前研究的局限性&#xff0c;可以最大程度上降低药品不良反应的重复发生&#xff0c;提高合理用药水平&#xff0c;同时也为监管、遴选、调整基本药物提供了数据支持。 所谓“是药三分毒”&#xff0c;药品是把双刃剑&#xff0c;具有两面性…

基于springboot+vue+Mysql的CSGO赛事管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…