ArrayList常用方法及源码分析

ArrayList常用方法

方法名方法说明
public boolean add(E e)将指定的元素追加到此集合的末尾
public boolean add(index E element)在此集合中的指定位置插入指定的元素
public void clear()从列表中删除所有元素
public boolean remove(Object o)从列表中删除指定元素的第一个出现(如果存在),并且返回值是否成功
public E remove(int index)删除该列表中指定位置的元素,返回!被!删除的元素(注意是指定位置的元素)
public E set(int index, E element)用指定的元素替换此列表中指定位置的元素,返回被替换的元素
public E get(int index)返回此列表中指定位置的元素
public int size()返回集合中的元素的个数------相当于数组以及字符串的length方法
package Com;
import java.util.ArrayList;

public class Demon1 {
    public static void main(String[] args){
        ArrayList<String> e = new ArrayList<>();
        e.add("程");//0
        e.add("序");//1
        e.add("猿");//2
        System.out.println("此时删除结果true和false是:"+e.remove("猿"));//利用public boolean remove(Object o)方法
        System.out.println("此时被删除指定位置的元素是:"+e.remove(1));//利用public E remove(index)方法
        System.out.println("修改第0个元素结果为:"+e.set(0,"翔"));//利用public E set(int index, E element)方法
        System.out.println("此时长度是:"+e.size());//利用public int size()方法
        System.out.println("最后用索引得到的元素是:"+e.get(0));//利用public E get(int index)方法
        System.out.println("最终结果输出是:"+e);

    }
}

ArrayList源码分析

  • ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长
  • ArrayList不是同步的(也就是说不是线程安全的),如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步,在多线程环境下,可以使用Collections.synchronizedList方法声明一个线程安全的ArrayList,例如:
    List arraylist = Collections.synchronizedList(new ArrayList());
    1. 下面通过ArrayList的源码来分析其原理。

源码分析1:
在这里插入图片描述
在这里插入图片描述

  1. ArrayList的构造方法: ArrayList提供了三种不同的构造方法:
    • ArrayList(),构造一个初始容量为 10 的空列表。
    • ArrayList(int initialCapacity),构造一个具有指定初始容量的空列表
    • ArrayList(Collection<? extends E> c),构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的
  • 当采用不带参数的构造方法ArrayList()生成一个集合对象时,其实是在底层调ArrayList(intinitialCapacity)这一构造方法生产一个长度为10的Object类型的数组。
  • 当采用带有集合类型参数的构造方法时,在底层生成一个包含相同的元素和长度的Object类型的数组。

源码分析2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. add方法:ArrayList提供了两种添加元素的add方法
    • add(E e),将指定的元素添加到此列表的尾部。
    • add(int index, E e),将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)private int size;
  • 如果集合中添加的元素超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,并将原数组中的元素copy到新数组中,并且后续添加的元素都会放在新数组中,当新数组的长度无 法容纳新添加的元素时,重复该过程。这就是集合添加元素的实现原理。

源码分析3
在这里插入图片描述

  1. get(int index),返回此列表中指定位置上的元素。

源码分析4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. remove方法:
    • E remove(int index),移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减1)。
    • boolean remove(Object o),移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动,返回boolean值。

源码分析5
在这里插入图片描述

  1. Object clone(),返回此ArrayList实例的浅表副本(不复制这些元素本身)

以上通过对ArrayList部分关键源码的分析,知道了ArrayList底层的实现原理,关于ArrayList源码有以下几点几点总结:

  1. ArrayList 底层是基于数组来实现的,可以通过下标准确的找到目标元素,因此查找的效率高;但是添加或删除元素会涉及到大量元素的位置移动,效率低。
  2. ArrayList提供了三种不同的构造方法,无参数的构造方法默认在底层生成一个长度为10的Object类型的数组,当集合中添加的元素个数大于10,数组会自动进行扩容,即生成一个新的数组,并将原数组的元素放到新数组中
  3. ensureCapacity方法对数组进行扩容,它会生成一个新数组,长度是原数组的1.5倍+1,随着向ArrayList中不断添加元素,当数组长度无法满足需要时,重复该过程。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发热的嘤嘤怪(2003计科胜胜同学)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值