首页 > 其他分享 >ArrayList详解

ArrayList详解

时间:2023-02-18 15:46:02浏览次数:34  
标签:index return int ArrayList Object 详解 es

ArrayList详解

ArrayList是实现了List接口,其内部是基于数组实现的:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    transient Object[] elementData; // non-private to simplify nested class access
}

数组的大小是固定的,一旦创建的时候指定了大小,就不允许再被修改了,只有在数组满的时候会自动扩容,因此是非常长灵活的。

创建一个ArrayList

创建一个ArrayList示例如下:

List<Object> list1=new ArrayList<>();
ArrayList<Object> list2=new ArrayList<>();

由于ArrayList实现了List接口,所以list1也可以是List类型。

向ArrayList添加元素

ArrayList添加元素的代码如下所示:

list.add(new Object);

需要注意的是:ArrayList一般插入元素是插在尾部,而且在插入的时候会判断当前维护的数组空间是否足够,如果不够则会执行grow()方法进行扩容。

private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
}


更新ArrayList中的元素

在ArrayList中更新元素的操作如下:

Object oldData = list1.set(index, newData);	//index指的是要更新元素的下标, newData指的是要更新值,oldData是返回的旧值

set源码如下所示:

public E set(int index, E element) {
        Objects.checkIndex(index, size);	//检查是否越界!!!
        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;				   //返回旧值
}

删除ArrayList中的元素

删除ArrayList中元素的示例如下:

list1.remove(index);	//根据索引删除
list1.remove("data");	//根据值删除

remove源码如下:

public E remove(int index) {
        Objects.checkIndex(index, size);	//检查是否越界
        final Object[] es = elementData;	

        @SuppressWarnings("unchecked") E oldValue = (E) es[index];
        fastRemove(es, index);

        return oldValue;
}

public boolean remove(Object o) {
        final Object[] es = elementData;
        final int size = this.size;
        int i = 0;
        found: {
            if (o == null) {
                for (; i < size; i++)
                    if (es[i] == null)
                        break found;
            } else {
                for (; i < size; i++)
                    if (o.equals(es[i]))
                        break found;
            }
            return false;
        }
        fastRemove(es, i);
        return true;
 }

查找ArrayList中的元素

查找元素可以分为正序查找和倒序查找,用法如下:

list1.indexOf("data");		//正序查找,如果找到第一个,则返回下标
list1.lastIndexOf("data");	//倒序查找,如果找到第一个,则返回下标

源码如下:

public int indexOf(Object o) {
        return indexOfRange(o, 0, size);
    }

    int indexOfRange(Object o, int start, int end) {
        Object[] es = elementData;
        if (o == null) {
            for (int i = start; i < end; i++) {
                if (es[i] == null) {
                    return i;
                }
            }
        } else {
            for (int i = start; i < end; i++) {
                if (o.equals(es[i])) {
                    return i;
                }
            }
        }
        return -1;
    }

    /**
     * Returns the index of the last occurrence of the specified element
     * in this list, or -1 if this list does not contain the element.
     * More formally, returns the highest index {@code i} such that
     * {@code Objects.equals(o, get(i))},
     * or -1 if there is no such index.
     */
    public int lastIndexOf(Object o) {
        return lastIndexOfRange(o, 0, size);
    }

    int lastIndexOfRange(Object o, int start, int end) {
        Object[] es = elementData;
        if (o == null) {
            for (int i = end - 1; i >= start; i--) {
                if (es[i] == null) {
                    return i;
                }
            }
        } else {
            for (int i = end - 1; i >= start; i--) {
                if (o.equals(es[i])) {
                    return i;
                }
            }
        }
        return -1;
    }

标签:index,return,int,ArrayList,Object,详解,es
From: https://www.cnblogs.com/xiaomitu/p/17132771.html

相关文章

  • Redis-Config详解以及订阅发布
     RedisConf详解对大小写不敏感可以加载其他confwjian 网络配置 通用配置 快照 安全配置 限制:最大连接数,最大容量,内存满了之后的配置 aof 持久......
  • LINUX串口相关属性设置详解
     Linux下串口的设置命令 查看串口波特率等信息:stty-F/dev/ttyS0-a#ttyS0为要查看的串口 设置串口参数:stty-F/dev/ttyS0ispeed115200ospeed115200cs8......
  • 二进制表示:原码、反码、补码详解
    本文主要介绍计算机中二进制的表示方法,详细介绍了十进制转二进制的方法,以及原码、反码和补码的不同和应用。一、二进制的计算要进行二进制的表示,首先需要进行计算二进制......
  • str_replace函数详解
    在开发过程中,字符串的操作是很频繁的,这几天有看PHP手册中讲解str_replace函数的讲解,不是很明白,特作如下笔记,以作备忘。     函数原型:mixed str_replace ( mixed $......
  • SnowFlake 雪花算法详解与实现 & MP中的应用
    BackGround现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局唯一性。对于MySQL而言,一个表中的主键id一般......
  • python 的 match case 用法详解
    Python3.10实现的match功能是其他开发语言中传统的switch的超集,它不仅仅是switch,可以实现更为复杂的功能。模式匹配大大增加了控制流的清晰度和表达能力。背景......
  • 【MySQL】事务日志 undo log 详解
    Redolog是事务持久性的保证,Undolog是事务原子性的保证。在事务中更新数据的前置操作其实就是要写入Undolog。1.Undo日志引入:事务需要保证原子性,也就是事务中的操作要么......
  • kubectl详解
    目录:陈述式资源管理方法详解(基本命令)项目的生命周期1、创建命令kubectlcreate2、发布kubectlexpose命令3、更新kubectlset 4、回滚kubectlroo......
  • API V3版本签名详解
    1.前言最近在折腾微信支付,证书还是比较烦人的,所以有必要分享一些经验,减少在开发微信支付时的踩坑。目前微信支付的API已经发展到V3版本,采用了流行的Restful风格。......
  • docker容器之dockerfile&docker-compose CMD/entrypoint详解
    docker容器之dockerfile&docker-composeCMD/entrypoint详解本文目录 [隐藏]I.CMDII.ENTRYPOINTIII.示例ENTRYPOINTCMD/command此前的RUN和CMD,我......