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接口的实现和内部实现原理。

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

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

相关文章

Django模型将模型注释同步到数据库

1、安装django-comment-migrate库 pip install django-comment-migrate 2、将库注册到settings.py文件中 INSTALLED_APPS [...django_comment_migrate, # 表注释... ] 3、加注释 3.1、给模型&#xff08;表&#xff09;加注释 在模型的class Meta中编辑 verbose_name&…

Go和Java实现适配器模式

Go和Java实现适配器模式 我们通过下面的实例来演示适配器模式的使用&#xff0c;其中&#xff0c;音频播放器设备只能播放 mp3 文件&#xff0c;通过使用一个更高级 的音频播放器来播放 vlc 和 mp4 文件。 1、适配器模式 适配器模式是作为两个不兼容的接口之间的桥梁。这种…

UML/SysML建模工具更新(2023.7)(1-5)有国产工具

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;Visual Paradigm 17.1 更新时间&#xff1a;2023年7月11日 工具简介 很用心的建模工具。支持编写用例规约。支持文本分析和C…

kafka怎么用代码读取数据

Kafka可以通过Java语言中的Kafka客户端库来读取数据。以下是一个简单的Java代码示例&#xff0c;通过Kafka Consumer API从Kafka集群中读取数据&#xff1a; java import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.…

TCP三次握手和四次挥手以及11种状态(二)

11种状态 1、一开始&#xff0c;建立连接之前服务器和客户端的状态都为CLOSED&#xff1b; 2、服务器创建socket后开始监听&#xff0c;变为LISTEN状态&#xff1b; 3、客户端请求建立连接&#xff0c;向服务器发送SYN报文&#xff0c;客户端的状态变味SYN_SENT&#xff1b; 4、…

数据结构---树和二叉树

这里写目录标题 树和二叉树的定义树的定义树的基本术语线性结构和树形结构的比较二叉树的定义起因定义 案例引入前缀码编码表达式的实现二叉树的抽象类型定义 二叉树的性质和存储结构二叉树的性质二叉树的特殊形式满二叉树完全二叉树 完全二叉树的两个性质二叉树的存储结构顺序…

ubuntu目录分析

在Ubuntu根目录下&#xff0c;以下是一些常见文件夹的含义&#xff1a; /bin&#xff1a;存放可执行文件&#xff0c;包含一些基本的命令和工具。 /boot&#xff1a;存放启动时所需的文件&#xff0c;如内核和引导加载程序。 /dev&#xff1a;包含设备文件&#xff0c;用于与硬…

IntelliJ IDEA 2023.2 新版本,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…

Ai创作系统ChatGPT源码搭建教程+附源码

系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 更新内容&#xff1a; 同步官方图片重新生成指令 同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GP…

移动IP的原理

目的 使得移动主机在各网络之间漫游时&#xff0c;仍然能保持其原来的IP地址不变 工作步骤 代理发现与注册 主机A&#xff1a;主机A移动到外地网络后&#xff0c;通过“代理发现协议”&#xff0c;与外地代理建立联系&#xff0c;并从外地代理获得一个转交地址&#xff0c;…

PTA 1076 Forwards on Weibo

个人学习记录&#xff0c;代码难免不尽人意。 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a …

Nginx动静分离、资源压缩、负载均衡、黑白名单、防盗链等实战

一、前言 Nginx是目前负载均衡技术中的主流方案&#xff0c;几乎绝大部分项目都会使用它&#xff0c;Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 二、…

SSD市场上演大洗牌,61TB豪华「别墅」横空出世

最近几年 SSD 售价是肉眼可见的下降&#xff0c;相信大伙儿没少跟着喝汤吃肉吧。 有人将这些变化归结于全球市场过饱和&#xff0c;需求下滑。 也有人认为国产 NAND 闪存崛起是压垮 SSD 高昂售价的最后一根稻草。 在小忆看来&#xff0c;不论是需求矛盾还是国产崛起不过是其中…

中国计算机学会推荐国际学术期刊(网络与信息安全)

序号刊物简称刊物全称分类类型专业领域1TDSCIEEE Transactions on Dependable and Secure ComputingA期刊网络与信息安全2TIFSIEEE Transactions on Information Forensics and SecurityA期刊网络与信息安全3Journal of CryptologyA期刊网络与信息安全1TISSECACM Transactions …

Mysql适用于初学者的前期入门资料

文章目录 前言一、SQL语句分类二、SQL语句的书写规范三.数据库操作四、MySQL字符集1、问题① 五、UTF8和UTF8MB4的区别六、数据库对象七、数据类型八、表的基本创建1、创建表2、查看表3、删除表4、修改表结构5、复制表的结构 九、数据库字典十、表的约束1、非空约束(NOT NULL)2…

在简历上写了“精通”后,拥有工作经验的我被面试官问到窒息

前言 如果有真才实学&#xff0c;写个精通可以让面试官眼前一亮&#xff01; 如果是瞎写&#xff1f;基本就要被狠狠地虐一把里&#xff01; 最近在面试&#xff0c;我现在十分后悔在简历上写了“精通”二字… 先给大家看看我简历上的技能列表&#xff1a; 熟悉软件测试理论基…

2023年深圳杯数学建模B题电子资源版权保护问题

2023年深圳杯数学建模 B题 电子资源版权保护问题 原题再现&#xff1a; 版权又称著作权&#xff0c;包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人…

微信如何提高回复信息速度?

规范流程话术有什么用&#xff1f;为了提高回复客户的效率和质量&#xff0c;可以事先设计好的一套标准化的对话模板。它通常包括多个环节和问题&#xff0c;帮助客服人员或销售人员在与客户沟通时&#xff0c;按照标准化的流程进行&#xff0c;以提高工作效率和客户满意度。 如…

数据中台系列1:redis 安装使用之 windows 篇

1、概述 redis官网上的安装包没有基于 window 系统的&#xff0c;但是有第三方开发的包&#xff0c;可以使用 redis&#xff0c;虽然版本低了点。因此&#xff0c;想在本机安装 redis 有以下办法&#xff1a; a、在 window 环境中安装低版本的 redis for window。因为作者已经…

vue 拦截 v-html 中 a 标签 href 跳转

记录 template 中 给需要 拦截的 代码片段加上click 方法 click“targetNodeNameClick” <p class"message-content message-content-text" v-html"replaceURLWithHTMLLinks(getText(message))" click"targetNodeNameClick"></p>然…