java源码-List源码解析

这篇具有很好参考价值的文章主要介绍了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接口的实现和内部实现原理。文章来源地址https://www.toymoban.com/news/detail-619141.html

到了这里,关于java源码-List源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STL源码分析】c++,List双向链表源码分析。自己实现list双向链表。

    参考链接:https://blog.csdn.net/man_sion/article/details/71003095? 先抽取要实现的功能,由于迭代器有些麻烦,就不使用了。要实现的功能有,push_back,pop_back,insert(指定位置,指定值),insert(指定位置,list,区间值),reverse,clear,getsize,begin,end,构造和析构函数,empty。 相关力扣题目:设计

    2024年02月03日
    浏览(43)
  • 【C++】STL中List的详细实现解析

    在 C++ STL(标准模板库)中, List 是一个带头双向链表,可以存储多个元素并且支持动态调整大小,适合频繁插入和删除操作;而 Vector 是一个动态数组,元素在内存中是连续存储的,适合需要快速随机访问的场景。 List 提供了添加、删除、查找等操作,而 Vector 除了这些基本

    2024年02月21日
    浏览(39)
  • Java:List转换List

    我们经常会遇到泛型转换泛型的时候,今天我们就介绍下使用java1.8和普通转换,其中测试数据自行添加 一、 ListObject  转  ListString 二、 ListObject  转  ListObject   三、 ListObject1  转  ListObject2 四、 ListObject1  转  ListObject2(普通转换)

    2024年01月16日
    浏览(47)
  • STL源码剖析系列:其一、list

    list的基本用法比较简单,可以参考站长严长生的教程: C++ list(STL list)容器完全攻略(超级详细) 下面重点介绍list源码。 二、

    2024年02月06日
    浏览(34)
  • 数据结构英文习题解析-第二章 链表List

    前言:最近快到FDS考试了,po重刷了一下学校的题目,自己整理了一些解析orz 因为po在自己找解析和学习的过程中非常痛苦,所以在此共享一下我的题目和自己写的解题思路,欢迎各位指出错误~全章节预计会陆续更新,可在专栏查看~ HW2 1. For a sequentially stored linear list of leng

    2024年04月11日
    浏览(51)
  • java中,将List<Map>转为List<实体>或者List<实体>转为List<Map>

    1、ListMap转List实体  2、List实体转ListMap

    2024年01月24日
    浏览(50)
  • 【C++初阶】list的模拟实现 附源码

    list底层是一个 双向带头循环链表 ,这个我们以前用C语言模拟实现过,-双向带头循环链表 下面是list的文档介绍: list文档介绍 我们会根据 list 的文档来模拟实现 list 的增删查改及其它接口。   既然是用C++模拟实现的,那么一定要 封装在类里 。 为了适合各种类型的数据,

    2024年02月17日
    浏览(42)
  • 【源码阅读】交易池txs_list

    accountSet 只是一组用于检查是否存在的地址,以及一个能够从交易中派生地址的签名者。 as *accountSet newAccountSet 创建一个带有关联签名者的新地址集,用于派生发件人。 创建一个新的accountSet对象 创建一个空映射并赋值给as.accounts 并将传入的地址使用 for range addrs 添加到该对象

    2024年02月03日
    浏览(20)
  • “List of Devices Attached“:Android设备连接问题解析

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将聚焦于一个在Android开发和移动设备管理中经常遇到的问题,那就是\\\"list of devices attached\\\"。让我们一起深入了解这个话题,了解其中的奥秘和解

    2024年03月13日
    浏览(48)
  • linux中 list_entry 设计背景及原理解析

    在这一版本中的 list_entry的宏定义实现如下: 乍一看,会觉得特别复杂,其实分析之后,会发现清晰明了: linux 中 list 为了实现类似 c++ list模板的效果,即一个list可以适用于各种不同的struct。便采用类似下图的设计,使list 相当于一个绳索,可以挂载各种 struct。通过当前

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包