当前位置: 首页 > news >正文

java源码-List源码解析

Java中的List是一个接口,它定义了一组操作列表的方法。List接口的常见子类包括ArrayList、LinkedList和Vector等。

以下是Java中List接口及其常见方法的源码解析:

1. List接口定义

```
public interface List<E> extends Collection<E> {
    // 返回列表中元素的数量
    int size();
    
    // 返回列表是否为空
    boolean isEmpty();

    // 判断列表中是否包含指定元素
    boolean contains(Object o);

    // 返回列表中所有元素的迭代器
    Iterator<E> iterator();

    // 返回列表中所有元素的数组
    Object[] toArray();

    // 将列表中所有元素拷贝到指定数组中
    <T> T[] toArray(T[] a);

    // 添加指定元素到列表末尾
    boolean add(E e);

    // 删除列表中指定元素
    boolean remove(Object o);

    // 判断列表中是否包含指定集合中的所有元素
    boolean containsAll(Collection<?> c);

    // 向列表中添加指定集合中的所有元素
    boolean addAll(Collection<? extends E> c);

    // 删除列表中与指定集合中元素相同的元素
    boolean removeAll(Collection<?> c);

    // 仅保留列表中与指定集合中元素相同的元素
    boolean retainAll(Collection<?> c);

    // 清空列表中所有元素
    void clear();

    // 获取列表中指定位置的元素
    E get(int index);

    // 用指定元素替换列表中指定位置的元素
    E set(int index, E element);

    // 在列表中指定位置插入指定元素
    void add(int index, E element);

    // 删除列表中指定位置的元素
    E remove(int index);

    // 获取列表中指定元素第一次出现的位置
    int indexOf(Object o);

    // 获取列表中指定元素最后一次出现的位置
    int lastIndexOf(Object o);

    // 返回一个列表的子列表
    List<E> subList(int fromIndex, int toIndex);

    // 返回一个列表的并行流
    Stream<E> parallelStream();
}
```

2. ArrayList类

ArrayList是一个基于数组实现的List类,它提供了调整大小、遍历和随机访问等常见操作。以下是ArrayList的常见方法:

```
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    // 构造函数
    public ArrayList(int initialCapacity);

    public ArrayList();

    public ArrayList(Collection<? extends E> c);

    // 返回列表中元素的数量
    public int size();

    // 判断列表是否为空
    public boolean isEmpty();

    // 判断列表中是否包含指定元素
    public boolean contains(Object o);

    // 返回列表中所有元素的迭代器
    public Iterator<E> iterator();

    // 返回列表中所有元素的数组
    public Object[] toArray();

    // 将列表中所有元素拷贝到指定数组中
    public <T> T[] toArray(T[] a);

    // 添加指定元素到列表末尾
    public boolean add(E e);

    // 删除列表中指定元素
    public boolean remove(Object o);

    // 判断列表中是否包含指定集合中的所有元素
    public boolean containsAll(Collection<?> c);

    // 向列表中添加指定集合中的所有元素
    public boolean addAll(Collection<? extends E> c);

    // 在列表末尾添加指定集合中的所有元素
    public boolean addAll(int index, Collection<? extends E> c);

    // 删除列表中指定集合中元素相同的元素
    public boolean removeAll(Collection<?> c);

    // 仅保留列表中与指定集合中元素相同的元素
    public boolean retainAll(Collection<?> c);

    // 清空列表中所有元素
    public void clear();

    // 获取列表中指定位置的元素
    public E get(int index);

    // 用指定元素替换列表中指定位置的元素
    public E set(int index, E element);

    // 在列表中指定位置插入指定元素
    public void add(int index, E element);

    // 删除列表中指定位置的元素
    public E remove(int index);

    // 获取列表中指定元素第一次出现的位置
    public int indexOf(Object o);

    // 获取列表中指定元素最后一次出现的位置
    public int lastIndexOf(Object o);

    // 返回一个列表的子列表
    public List<E> subList(int fromIndex, int toIndex);

    // 返回一个列表的并行流
    public Stream<E> parallelStream();

    // 对列表进行排序
    public void sort(Comparator<? super E> c);
}
```

3. LinkedList类

LinkedList是一个基于双向链表实现的List类,它提供了添加、删除、检索以及与栈和队列相关的方法。以下是LinkedList的常见方法:

```
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
    // 构造函数
    public LinkedList();

    public LinkedList(Collection<? extends E> c);

    // 返回列表中元素的数量
    public int size();

    // 判断列表是否为空
    public boolean isEmpty();

    // 判断列表中是否包含指定元素
    public boolean contains(Object o);

    // 返回列表中所有元素的迭代器
    public Iterator<E> iterator();

    // 返回列表中所有元素的反向迭代器
    public Iterator<E> descendingIterator();

    // 在列表末尾添加指定元素
    public boolean add(E e);

    // 在列表头部添加指定元素
    public void addFirst(E e);

    // 在列表末尾添加指定元素
    public void addLast(E e);

    // 删除列表中指定元素
    public boolean remove(Object o);

    // 删除并返回列表头部的元素
    public E remove();

    // 删除并返回列表头部的元素
    public E removeFirst();

    // 删除并返回列表末尾的元素
    public E removeLast();

    // 获取列表头部元素
    public E getFirst();

    // 获取列表末尾元素
    public E getLast();

    // 替换列表中指定位置的元素
    public E set(int index, E element);

    // 在列表中指定位置插入指定元素
    public void add(int index, E element);

    // 获取列表中指定位置的元素
    public E get(int index);

    // 删除列表中指定位置的元素
    public E remove(int index);

    // 获取列表中指定元素第一次出现的位置
    public int indexOf(Object o);

    // 获取列表中指定元素最后一次出现的位置
    public int lastIndexOf(Object o);

    // 返回一个列表的子列表
    public List<E> subList(int fromIndex, int toIndex);
}
```

4. Vector类

Vector是一个基于数组实现的List类,与ArrayList非常类似。不同之处在于Vector是线程安全的,支持同步操作。以下是Vector的常见方法:

```
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    // 构造函数
    public Vector(int initialCapacity, int capacityIncrement);

    public Vector(int initialCapacity);

    public Vector();

    public Vector(Collection<? extends E> c);

    // 返回列表中元素的数量
    public int size();

    // 判断列表是否为空
    public boolean isEmpty();

    // 判断列表中是否包含指定元素
    public boolean contains(Object o);

    // 返回列表中所有元素的迭代器
    public Iterator<E> iterator();

    // 返回列表中所有元素的数组
    public Object[] toArray();

    // 将列表中所有元素拷贝到指定数组中
    public <T> T[] toArray(T[] a);

    // 添加指定元素到列表末尾
    public synchronized boolean add(E e);

    // 删除列表中指定元素
    public synchronized boolean remove(Object o);

    // 判断列表中是否包含指定集合中的所有元素
    public synchronized boolean containsAll(Collection<?> c);

    // 向列表中添加指定集合中的所有元素
    public synchronized boolean addAll(Collection<? extends E> c);

    // 在列表末尾添加指定集合中的所有元素
    public boolean

上面的代码中,我们可以看到ArrayList类继承了AbstractList类,并实现了List、RandomAccess、Cloneable、Serializable接口。ArrayList内部使用一个Object数组elementData来存储元素,同时使用一个int类型的变量size来记录ArrayList的大小。

在ArrayList的构造函数中,我们可以看到有两种不同的构造方法。第一种是无参构造方法,它将elementData初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。第二种是有参构造方法,可以传入一个整型参数来指定ArrayList的容量,如果该参数小于等于0,则将elementData初始化为EMPTY_ELEMENTDATA;如果该参数大于0,则会初始化一个大小为initialCapacity的Object数组。

在ArrayList中添加元素的方法有两种:add和add(int index, E element)。add(E e)方法是最常用的添加元素的方法,它将元素添加到ArrayList的末尾。而add(int index, E element)方法则可以将元素添加到ArrayList的特定位置。

在ArrayList中获取元素的方法是get(int index)。在ArrayList中删除元素的方法是remove(int index)。而在ArrayList中修改元素的方法是set(int index, E element)。

在ArrayList中自动扩容的方法是ensureCapacityInternal(int minCapacity)和grow(int minCapacity)。其中,ensureCapacityInternal(int minCapacity)方法是一个私有方法,它用来判断是否需要扩容,如果需要则调用grow(int minCapacity)方法进行扩容。grow(int minCapacity)方法会创建一个新的Object数组,并将原来的Object数组中的元素复制到新数组中,然后将新数组赋值给elementData变量。

以上是一个简单的ArrayList类的源码解析,可以帮助我们更好地理解List接口的实现和内部实现原理。

相关文章:

java源码-List源码解析

Java中的List是一个接口&#xff0c;它定义了一组操作列表的方法。List接口的常见子类包括ArrayList、LinkedList和Vector等。 以下是Java中List接口及其常见方法的源码解析&#xff1a; 1. List接口定义 public interface List<E> extends Collection<E> { …...

Mybatis的动态SQL

动态 sql 是Mybatis的强⼤特性之⼀&#xff0c;能够完成动态的 sql 语句拼接。 动态 SQL 大大减少了编写代码的工作量&#xff0c;更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 Mybatis里的动态标签主要有: <if><trim><where><set><forea…...

嵌入式系统中的GPIO控制:从理论到实践与高级应用

本文将探讨嵌入式系统中的GPIO(通用输入输出)控制,着重介绍GPIO的原理和基本用法。我们将使用一个实际的示例项目来演示如何通过编程配置和控制GPIO引脚。将基于ARM Cortex-M微控制器,并使用C语言进行编写。 GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工…...

7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?

7D透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业广告、展览展示、智能家居等&#xff0c;具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术&#xff0c;将图像通过透明屏幕投射出来…...

[游戏开发][Unity] 打包Xcode工程模拟器+真机调试

苹果开发者账号 账号分三类&#xff0c;个人&#xff0c;公司&#xff0c;企业&#xff0c;价格99/99/299美金 新注册账号的基本设置按网上的教程来就行 我们公司是企业账号&#xff0c;我的苹果开发者账号是公司一个User 下面讲述一下一个全新的打包机处理流程 首先是要把…...

python 添加环境变量

1 查看是否设置环境变量 和 使用的python在哪里安装 import sys import os# 获取Python的安装目录 import os import syspython_path sys.executable # 这个是python.exe的路径python_path os.path.dirname(python_path) print("Python安装路径:", python_path)# …...

如何用DHTMLX组件为Web应用创建甘特图?(一)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…...

网站SEO优化:提升搜索排名与流量引爆

导言&#xff1a; 在互联网时代&#xff0c;网站SEO&#xff08;搜索引擎优化&#xff09;是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面&#xff0c;让搜索引擎更好地理解和收录网站内容&#xff0c;从而为网站带来更多有价值的有机…...

Java lamda对List<JSONObject>里多个动态属性字段进行动态的降序或者升序

最近做到一个需求&#xff0c;需要把业务侧返回的数据&#xff08;格式为List<JSONObject>&#xff09;,然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对List<JSONObject>中的多个属性字段进行动态的升序或降序排序&#xff0c;我们可以根据需…...

Lua脚本解决多条命令原子性问题

Redis是一个流行的键值存储数据库&#xff0c;它提供了丰富的功能和命令。在Redis中&#xff0c;我们可以使用Lua脚本来编写多条命令&#xff0c;以确保这些命令的原子性执行。Lua是一种简单易学的编程语言&#xff0c;下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…...

NAT详解(网络地址转换)

一句话说清楚它是干什么的&#xff1a; 网络地址转换&#xff1a;是指通过专用网络地址转换为公用地址&#xff0c;从而对外隐藏内部管理的IP地址&#xff0c;它使得整个专用网只需要一个全球IP就可以访问互联网&#xff0c;由于专用网IP地址是可以重用的&#xff0c;所以NAT大…...

【第一阶段】ktolin的函数

在Java中我们称之为方法&#xff0c;方法必须写在类里面&#xff0c;依赖于类。 在kotlin中函数写在类里面和外面都是可以的。称之为函数 class test{fun view(){} }fun main() {println("Hello, world!!!") }执行结果 Hello, world!!!main函数的返回值类型为Unit等…...

pytorch模型的保存与加载

1 pytorch保存和加载模型的三种方法 PyTorch提供了三种种方式来保存和加载模型&#xff0c;在这三种方式中&#xff0c;加载模型的代码和保存模型的代码必须相匹配&#xff0c;才能保证模型的加载成功。通常情况下&#xff0c;使用第一种方式&#xff08;保存和加载模型状态字…...

IDE /完整分析C4819编译错误的本质原因

文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…...

前端学习路线(2023)

这个前端学习路线看起来很详细和全面&#xff0c;涵盖了从基础知识到高级框架&#xff0c;从单机开发到全栈项目&#xff0c;从混合应用到原生应用&#xff0c;从性能优化到架构设计的各个方面。如果你能够按照这个路线学习和实践&#xff0c;我相信你一定能够成为一名优秀的前…...

景区如何对旅行社进行分销管理?

旅行社的买票能力强&#xff0c;一般景区会跟多家旅行社合作门票分销。其中卖票下单、价格设定、财务对账结算都出现了很多问题&#xff0c;导致对账困难&#xff0c;查询困难&#xff0c;甚至可能有偷票漏票的情况出现&#xff0c;给景区收入造成损失。那要怎么处理呢&#xf…...

四步从菜鸟到高手,Python编程真的很简单(送书第一期:文末送书2本)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支持&#xff0c;我…...

Thread类的常用结构(java))

1 构造器 public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :指定创建线程的目标对象&#xff0c;它实现了Runnable接口中的run方法public Thread(Runnable target,String name) :分配一…...

CSS :nth-child

CSS :nth-child :nth-child 伪类根据元素在同级元素中的位置来匹配元素. CSS :nth-child 语法 值是关键词 odd/evenAnB最新的 [of S] 语法权重 浏览器兼容性 很简单的例子, 来直觉上理解这个伪类的意思 <ul><li class"me">Apple</li><li>B…...

国内好用的企业级在线文档有哪些?

在当今数字化时代&#xff0c;企业级在线文档已经成为了现代办公环境中不可或缺的一部分。它不仅能够提高工作效率&#xff0c;还能够实现多人协同编辑&#xff0c;满足团队协作的需求。那么&#xff0c;在国内市场上&#xff0c;哪些企业级在线文档产品备受企业青睐呢&#xf…...

P1217 [USACO1.5] 回文质数 Prime Palindromes

题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 151 是回文质数。 写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000…...

【STM32MP1系列】DDR内存测试用例

DDRDDR内存测试 一、uboot下测试DDR内存二、Linux内核下测试DDR内存1、使用memtester测试DDR内存2、使用stressapptest测试DDR内存三、Buildroot中构建memtester软件包四、搭建stressapptest软件包五、注意事项一、uboot下测试DDR内存 输入bdinfo查看DDR起始地址以及大小: b…...

【CAS6.6源码解析】调试Rest API接口

CAS的web层默认是基于webflow实现的&#xff0c;ui和后端是耦合在一起的&#xff0c;做前后端分离调用和调试的时候不太方便。但是好在CAS已经添加了支持Rest API的support模块&#xff0c;添加相应模块即可。 文章目录 添加依赖并重新build效果 添加依赖并重新build 具体添加…...

C++设计模式之模板方法、策略模式、观察者模式

面向对象设计模式是”好的面向对象设计“&#xff0c;所谓”好的面向对象设计“指的是可以满足”应对变化&#xff0c;提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点&#xff0c;然后在变化点处应用设计模式&#xff0c;从而更好地…...

【计算机网络 02】物理层基本概念 传输媒体 传输方式 编码与调制 信道极限容量 章节小结

第二章 -- 物理层 2.1 物理层基本概念2.2 物理层下的传输媒体2.3 传输方式2.4 编码与调制2.5 信道极限容量2.6 章节小结 2.1 物理层基本概念 2.2 物理层下的传输媒体 传输媒体也称为传输介质或传输媒介&#xff0c;他就是数据传输系统中在发送器和接收器之间的物理通路 传输媒…...

无涯教程-jQuery - serialize( )方法函数

serialize()方法将一组输入元素序列化为数据字符串。 serialize( ) - 语法 $.serialize( ) serialize( ) - 示例 假设无涯教程在serialize.php文件中具有以下PHP内容- <?php if( $_REQUEST["name"] ) {$name$_REQUEST[name];echo "Welcome ". $na…...

一套不错的基于uniapp实现的投票类小程序/H5

最近作者心血来潮&#xff0c;想做一个热点话题投票&#xff0c;话题相关的资讯跟踪类的小程序&#xff0c;方便自己发布一些大家比较关心的话题。 基于以上需求&#xff0c;说干就干&#xff0c;首先需要定义一个需求&#xff1a; 1、支持热门话题投票、排行榜&#xff08;日…...

Mac代码编辑器sublime text 4中文注册版下载

Sublime Text 4 for Mac简单实用功能强大&#xff0c;是程序员敲代码必备的代码编辑器&#xff0c;sublime text 4中文注册版支持多种编程语言&#xff0c;包括C、Java、Python、Ruby等&#xff0c;可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观&#xff0c;支持多…...

django------模糊查询

1.常用模糊查询的方法 queryset中支持链式操作 bookBook.objects.all().order_by(-nid).first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象本身 大于、大于等于、小于、小于等于&#xff1a; # __gt 大于> # __gte 大于等于> # __lt 小于< …...

AVFoundation - 音视频组合编辑

文章目录 一、简要说明二、使用1、音频和视频合成2、视频的拼接一、简要说明 相关类 AVMutableCompositionAVMutableCompositionTrack二、使用 1、音频和视频合成 - (void)testCom1{AVMutableComposition *mutableComposition = [AVMutableComposition composition];AVMu...