• ArrayList与顺序表


    简要介绍

    顺序表是一段物理地址连续的储存空间,一般情况下用数组储存,并在数组上完成增删查改。而在java中我们有ArrayList这个容器类封装了顺序表的方法。
    在集合框架中,ArrayList是一个普通的类,其实现了list接口。其源码类定义如图在这里插入图片描述
    可见,其实现了RandomAccess, Cloneable, 以及Serializable接口,分别代表了其支持随机访问,clone,以及序列化。

    1.Arraylist容器类的使用

    1.1Arraylist容器类的构造

    在这里插入图片描述

     public static void main(String[] args) {
            //无参数的构造方法
            List<Integer> list1 = new ArrayList<>();
    
            //指定初始容量的构造方法
            List<Integer> list2 = new ArrayList<>();
    
            list1.add(1);
            list1.add(2);
            list1.add(3);
    
            //使用其他collection进行初始化(此处是ArrayList)
            List<Integer> list3 = new ArrayList<>(list1);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.2 ArrayList的常见方法

    方法解释
    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)截取部分 list
    List<String> list = new ArrayList<>();
            list.add("盛夏");// 尾插元素 “盛夏”
            list.add(1,"洋光");//在1下标处插入元素 “洋光”
            list.addAll(list);//将list中的元素全部尾插
    
            list.remove(0);//删除0下标处的元素
            boolean flg = list.remove("盛夏");//删除遇到的第一个元素“盛夏”,删除成功flg为true,删除失败flg为false;
    
            String s = list.get(0);//获取0下标处的元素
            list.set(0,"盛夏");//将0下标元素设为 “盛夏”
    
            boolean flg1 = list.contains("盛夏");//查询“盛夏”是否在顺序表内,存在flg1为true,不存在flg1为false;
    
            list.indexOf("盛夏");//返回第一个 "盛夏" 所在下标
            list.lastIndexOf("盛夏");// 返回最后一个 "盛夏" 的下标
    
            //截取list的[0,1)为subList,注意区间左闭右开
            List<String> subList = list.subList(0,1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注:此处的subList方法只是截取了原list中被截取部分的地址,所以若改变subList元素,原list中元素也会改变。

    1.3ArrayList的遍历

    循环遍历
    for-each遍历

    //循环遍历
            for(int i = 0; i<list.size();i++){
                System.out.print(list.get(i)+" ");
            }
            
            //for-each 遍历
            for(String i:list){
                System.out.print(i+" ");
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.4ArrayList中的扩容机制

    源码分析:
    1.当我们调用无参构造方法,或者参数为0时,此时的数组为一个空数组。
    在这里插入图片描述
    在这里插入图片描述
    而当第一次add的时候,底层的数组容量才变成了10;

    2.后续若在需扩容,按照1.5倍扩容在这里插入图片描述
    即:1.无参构造方法,或参数为零构造方法,底层数组为0,第一次add后,底层数组为10,10个放满后以1.5倍扩容
    2.参数大于零的构造方法,底层数组为参数,数组放满后,以1.5倍扩容。

  • 相关阅读:
    【状语从句练习题】although vs but
    和鲸科技创始人范向伟受邀出席“凌云出海,来中东吧”2023华为云上海路演活动
    Flink
    PHP开发API小技巧,还不快上车?【php下的电商API封装接口】
    技术周总结 08.05-08.11周日(scala git回滚)
    【数据结构】—— 树状数组
    vue3项目的src下的各个文件夹介绍
    Ubuntu升级Python报错pydtrace_probes.h: No such file or directory
    Java多线程开发系列之六:无限分解流----Fork/Join框架
    上网行为管控,一款软件就可以实现!
  • 原文地址:https://blog.csdn.net/m0_62476684/article/details/125349066