ArrayList详解

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;
    }
posted @   LilyFlower  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示