【Java ArrayList】从入门到精通:从概念,使用到扩容机制,一篇带你掌握Java动态数组核心

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构

在这里插入图片描述
在这里插入图片描述
【前言】

ArrayList 是 Java 集合框架(Java Collections Framework)中最常用的动态数组实现,它提供了灵活的容量管理、便捷的增删改查操作,广泛应用于日常开发中。本文将深入剖析 ArrayList 的底层结构、核心方法源码、性能特点及最佳实践,帮助读者彻底掌握这一基础数据结构。

一、ArrayList的概念

ArrayList基于动态数组实现,底层维护一个Object[ ]数组,elementDate存储元素,同时通过size变量记录当前有效元素个数,容量可自动扩容。它实现了List接口,如下图:
在这里插入图片描述

  • ArrayList是以泛型方式实现,使用时必须实例化
  • ArrayList实现RandomAccess接口,ArrayList可随机访问
  • ArrayList实现Cloneable接口,ArrayList可以克隆
  • ArrayList实现Serializable接口,支持序列化
  • ArrayList不是线程安全,在单线程下可以使用在多线程中可以选择Vector或者CopyOnWriteArrayList;
  • ArrayList底层是一段连续的空间,可以自动扩容,是一个动态类型的顺序表

二、ArrayList的使用

1.构造ArrayList

ArrayList提供三种构造函数:

方法说明
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他Collection构建ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

1.1 无参构造方法

 public static void main(String[] args) {
 //创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);
    }

【源码:】
在这里插入图片描述

1. 2 带有初始容量的构造方法

//创建一个有初始容量的ArrayList
ArrayList<Integer> list2 = new ArrayList<>(5);
        list2.add(22);
        list2.add(33);
        list2.add(44);
        System.out.println(list2);

【源码:】
在这里插入图片描述

1.3 用其他集合类构造ArrayList

  • 类型一定是实现了Collection接口
  • 传的参数要是E或E的子类
 //创建一个有初始容量的ArrayList
        ArrayList<Integer> list2 = new ArrayList<>(5);
        list2.add(22);
        list2.add(33);
        list2.add(44);
        System.out.println(list2);
        //都是Integer类型,可以传
        ArrayList<Integer> list3 = new ArrayList<>(list2);

【源码:】
在这里插入图片描述

2.操作方法

方法签名描述
boolean add(E e)将元素 e 插入到列表末尾
void add(int index, E element)将元素 e 插入到指定的 index 位置
boolean addAll(Collection<? extends E> c)将集合 c 中的所有元素插入到列表末尾
E remove(int index)删除并返回指定 index 位置的元素
boolean remove(Object o)删除列表中第一个遇到的元素 o
E get(int index)获取指定 index 位置的元素
E set(int index, E element)将指定 index 位置的元素替换为 element
void clear()清空列表中的所有元素
boolean contains(Object o)判断列表中是否包含元素 o
int indexOf(Object o)返回第一个匹配元素 o 的索引
int lastIndexOf(Object o)返回最后一个匹配元素 o 的索引
List<E> subList(int fromIndex, int toIndex)返回从 fromIndextoIndex 的子列表

2.1 boolean add(E e):尾插e

 //创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        //末尾插入1
        list.add(1);
        System.out.println(list);

2.2 void add(int index,E element):将e插入index位置

  //创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        //0位置插入1
        list.add(0,1);
        System.out.println(list);

2.3 boolean addAll(Collection<?extends E>c):尾插c中的元素

 //创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        //0位置插入1
        list.add(1);
        list.add(11);
        list.add(111);
        System.out.println(list);
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.addAll(list);
        list2.add(1111);
        System.out.println(list2);

在这里插入图片描述

2.4 E remove(int index/Object o)

 //创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        //0位置插入1
        list.add(1);
        list.add(11);
        list.add(111);
        System.out.println(list);
        list.remove(2);//下标
        //对象
        list.remove(new Integer(2));
        Integer x = 2;//写法2
        list.remove(x);

2.4 ListsubList(int fromIndex,int toIndex):截取list部分

//创建一个空的ArrayList
        ArrayList<Integer> list = new ArrayList<>();
        //0位置插入1
        list.add(1);
        list.add(11);
        list.add(111);
        list.add(1111);
        System.out.println(list);
        List<Integer> subList = list.subList(1,3);
        System.out.println(subList);
  • 它的截取是左闭右开,截取1~3位置,取2,3
  • 后面如果修改元素,截取的也会随之修改,实际截取的是地址

在这里插入图片描述

一些简单的方法就不一一列举了,直接调用就行,具体的方法实现可以看这篇【Java ArrayList】底层方法的自我实现

三、ArrayList的遍历

1.for循环遍历

 for (int i = 0; i < list.size(); i++) {
            Integer a = list.get(i);
            System.out.println(a+" ");
        }

2.增强型for循环

 for (int x : list){
            System.out.println(x+" ");
        }

3.迭代器

只要实现Iterable接口,都可以使用迭代器打印
it.next():访问下一个,it望后走一步

 Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next()+" ");
        }

从指定位置开始打印

//可以从指定位置开始打印
        ListIterator<Integer> it2 = list.listIterator(2);
        while (it2.hasNext()){
            System.out.println(it2.next()+" ");
        }

逆向打印

ListIterator<Integer> it = list.listIterator(list.size());
        while (it.hasPrevious()){
            System.out.println(it.previous()+" ");
        }

四、ArrayList扩容机制

ArrayList是⼀个动态类型的顺序表,在插⼊元素的过程中会⾃动扩容

  • 如果调⽤不带参数的构造⽅法,第⼀次分配数组⼤⼩为10
  • 后续扩容为1.5倍扩容

源码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【总结】

ArrayList 是基于动态数组的 List 实现,具有随机访问快、使用便捷的特点,适合大多数读多写少的场景。本文从底层原理、核心方法、性能分析到注意事项,全面剖析了 ArrayList 的特性,希望能帮助读者深入理解并灵活运用这一基础数据结构。

在这里插入图片描述

评论 85
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值