首页 > 编程语言 >ArrayList 源码阅读

ArrayList 源码阅读

时间:2023-07-10 11:34:11浏览次数:25  
标签:index Object int ArrayList elementData 源码 阅读 size

ArrayList 源码阅读

常用的有序集合,采用的是线性结构,和 ArrayList 形成对比的是 LinkedList,线性表的优点在于遍历查询,链表优点在于修改。

属性

private static final long serialVersionUID = 8683452581122892189L;

/**
 * m默认大小
 */
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

/**
 * 长度
 *
 * @serial
 */
private int size;

构造器

ArrayList(int initialCapacity) 指定容量的构造方法(默认是 10)

/**
 * 可初始化默认容量大小,若小于零则抛异常,指定0为默认容量 10
 *
 * @param  initialCapacity  the initial capacity of the list
 * @throws IllegalArgumentException if the specified initial capacity
 *         is negative
 */
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

无参构造

/**
   * 数据设置为默认为容量时的数据
   */
  public ArrayList() {
      this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }

ArrayList(Collection<? extends E> c)

/**
     * 以集合创建集合,把数据放入的elementData,然后判断长度进行设置size,并进行复制数据
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

常用方法

grow(int minCapacity) 扩容

/**
 * 集合的扩容
 *
 * @param minCapacity the desired minimum capacity
 */
private void grow(int minCapacity) {
    // 原容量
    int oldCapacity = elementData.length;
    // 原容量+原容量>>1 = 1.5 原容量
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    // 判断新容量是否超出最大容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

indexOf(Object o) 查找元素位置的

/**
 *  遍历查询,判断是否相等,则需要对象重写equals,返回的时第一次出现的位置
 */
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}
/**
 * 遍历查询,判断是否相等,则需要对象重写equals,返回的时最后一次出现的位置
 */
public int lastIndexOf(Object o) {
    if (o == null) {
        for (int i = size-1; i >= 0; i--)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = size-1; i >= 0; i--)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

add(int index, E element) 添加

/**
 * @param index index at which the specified element is to be inserted
 * @param element element to be inserted
 * @throws IndexOutOfBoundsException {@inheritDoc}
 */
public void add(int index, E element) {
    // 检测是否越界
    rangeCheckForAdd(index);
    // 扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    // 复制
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    // 设置值
    elementData[index] = element;
    // 长度加一
    size++;
}

常见问题

标签:index,Object,int,ArrayList,elementData,源码,阅读,size
From: https://www.cnblogs.com/jiuxialb/p/17540461.html

相关文章

  • HashMap 源码阅读
    HashMap源码阅读HashMap是线程不安全的,若需要考虑线程安全则需要用HashTable属性//默认大小1<<4为16staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;//最大2的30次方staticfinalintMAXIMUM_CAPACITY=1<<30;//默认负载因子0.75staticfinal......
  • String 源码阅读
    String源码阅读1.属性/**Thevalueisusedforcharacterstorage.*/privatefinalcharvalue[];/**Cachethehashcodeforthestring*/privateinthash;//Defaultto0/**useserialVersionUIDfromJDK1.0.2forinteroperability*/privatestaticfi......
  • LinkedList 源码阅读
    LinkedList源码阅读LinkedList是通过实现链表从而进行存储的,其有私有内部类Node,通过泛型,从而实现储存各种类型对象。privatestaticclassNode<E>{//该节点的数据Eitem;//链表下一级Node<E>next;//上一级Node<E>prev;//构......
  • A011 《千变万化》编程 源码
    一、课程介绍本节课用嵌套for循环、input()获取用户输入、int()转换为整数类型,绘制一个由正多边形组成的花朵。二、重难点解析数据类型数据有类型区分,常用的有整数类型和字符串类型。像10、37、-17、0等数字就是整数类型;而'3'、'27'、'一语惊醒梦中人'、'yyjxmzr'等被引号......
  • 【从0开始编写webserver·基础篇#03】TinyWeb源码阅读,还是得看看靠谱的项目
    【前言】之前通过看书、看视频和博客拼凑了一个webserver,然后有一段时间没有继续整这个项目现在在去看之前的代码,真的是相当之简陋,而且代码设计得很混乱,我认为没有必要继续在屎堆上修改了,于是开始阅读别人的较为规范的开源实现目的是尝试理解一个可用级别的webserver需要具备哪......
  • ThreadLocal源码
    使用场景ThreadLocal用来提供线程局部变量。每个线程都会有一份独立的副本,副本之间不存在竞争关系,是线程专属的内存空间。例如:publicclassThreadLocalTest{privatestaticfinalThreadLocal<Integer>threadLocal=newThreadLocal<>();publicstaticvoidma......
  • Qt源码阅读(五)-deleteLater
    QtdeleteLater作用及源码分析个人经验总结,如有错误或遗漏,欢迎各位大佬指正......
  • 所有源码关注公众号获取
    一、所有源码获取方法:1.关注公众号->商业项目->杂货铺->cv视觉源码;2.根据关键字搜索项目二、项目合作、学生毕设:1.专业的团队,985毕业,大厂工作;2.专业的服务,支持答疑;        公众号:                    个人号: ......
  • 基于MFC dll实现C++/CLI dll组件全过程详解(附完整源码) 浮云绘图
    ​模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类......
  • 透明信息提示框CFyToolTip设计及源码 适用于各类绘图的实时信息展示
    在图形绘制领域,经常需要用到透明的信息提示窗口,比如当鼠标移动到一个图元上,显示该图元对象的实时数据(如设备名称、状态、实测数据等),当鼠标移开,及时隐藏该提示框;比如在曲线控件绘图时,随着鼠标移动,实时展示曲线对应的横纵坐标值等​ 各种通用开发库里,也有类似的控件,如C#WinFor......