List接口(1) | ArrayList

参考阅读:ArrayList 源码分析

一、特点

ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口,具有以下特点:

  • 支持添加,删除和查找操作
  • 支持随机快速访问,即通过元素的序号快速读取元素
  • 支持拷贝(深拷贝或浅拷贝)
  • 支持序列化(对象转为字节流进行储存或网络传输)

二、扩容机制

  1. 以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。
  2. 调用add方法,默认追加到队尾,如果元素个数大于初始化的10,那么调用grow方法进行扩容。
  3. int newCapacity = oldCapacity + (oldCapacity >> 1),所以 ArrayList 每次扩容之后容量都会变为原来的 1.5 倍左右(oldCapacity 为偶数就是 1.5 倍,否则是 1.5 倍左右)! 奇偶不同,比如:10+10/2 = 15, 33+33/2=49。如果是奇数的话会丢掉小数.

">>"(移位运算符):>>1 右移一位相当于除 2,右移 n 位相当于除以 2 的 n 次方。这里 oldCapacity 明显右移了 1 位所以相当于 oldCapacity /2。对于大数据的 2 进制运算,位移运算符比那些普通运算符的运算要快很多,因为程序仅仅移动一下而已,不去计算,这样提高了效率,节省了资源

三、特殊方法

1. System.arraycopy() 和 Arrays.copyOf() 方法

    // 我们发现 arraycopy 是一个 native 方法,接下来我们解释一下各个参数的具体意义
    /**
    *   复制数组
    * @param src 源数组
    * @param srcPos 源数组中的起始位置
    * @param dest 目标数组
    * @param destPos 目标数组中的起始位置
    * @param length 要复制的数组元素的数量
    */
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

  public static int[] copyOf(int[] original, int newLength) {
      // 申请一个新的数组
        int[] copy = new int[newLength];
  // 调用System.arraycopy,将源数组中的数据进行拷贝,并返回新的数组
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

看两者源代码可以发现 copyOf()内部实际调用了 System.arraycopy() 方法

arraycopy() 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置。

copyOf() 是系统自动在内部新建一个数组,并返回该数组。

2. ensureCapacity()

我们可以看出向 ArrayList 添加大量元素之前使用ensureCapacity 方法可以提升性能。

四、注意

  • 可以添加null值
  • 不保证线程安全

相关推荐

  1. List接口1) | ArrayList

    2024-04-10 10:36:08       43 阅读
  2. List<int[]>[] g = new ArrayList[n];

    2024-04-10 10:36:08       42 阅读
  3. ArrayList为什么要实现RandomAccess接口

    2024-04-10 10:36:08       28 阅读
  4. <span style='color:red;'>ArrayList</span>

    ArrayList

    2024-04-10 10:36:08      30 阅读
  5. ArrayList

    2024-04-10 10:36:08       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 10:36:08       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 10:36:08       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 10:36:08       87 阅读
  4. Python语言-面向对象

    2024-04-10 10:36:08       96 阅读

热门阅读

  1. 关于yolov8x-p2.yaml

    2024-04-10 10:36:08       38 阅读
  2. 链表,栈,队列的区别及其应用

    2024-04-10 10:36:08       34 阅读
  3. 如何生成 ssh 秘钥?

    2024-04-10 10:36:08       35 阅读
  4. 7-11完全二叉树的层序遍历

    2024-04-10 10:36:08       37 阅读
  5. SQL注入漏洞详解

    2024-04-10 10:36:08       32 阅读
  6. UML学习

    UML学习

    2024-04-10 10:36:08      31 阅读
  7. sql_mode

    2024-04-10 10:36:08       37 阅读
  8. React Router 中常用的方法总结

    2024-04-10 10:36:08       37 阅读
  9. OceanBase 中一个关于 NOT IN 子查询的 SQL 优化案例

    2024-04-10 10:36:08       30 阅读