zoukankan      html  css  js  c++  java
  • Java集合之ArrayList源码分析

    概述

    ArrayList可以理解为动态数组, 根据MSDN的说法, 就是Array的复杂版本. 与数组相比, 它的容量能动态增长. ArrayList是List接口的可变数组的实现. 实现了所有可选列表操作, 允许包括null在内的所有元素.

    数组的特点, 查询快增删慢.

    每个ArrayList实例都有一个容量, 该容量是指向用来存储列表元素的数组大小. 随着向ArrayList中不断添加元素, 其容量也自动增长, 自动增长会带来数据向新数组的重新拷贝, 因此, 如果可预知数据量的多少, 可在构造ArrayList时指定其容量. 在添加大量元素前, 应用程序也可以使用 ensureCapacity 方法来增加ArrayList实例的容量, 可以减少递增式再分配的数量.

    注意: ArrayList不是线程安全的.

    ArrayList原理

    ArrayList实现了List接口、底层使用数组保存所有元素, 其操作基本上是对数组的操作.

    Java集合之ArrayList

     

    ArrayList继承了AbstractList, 实现了List. 它是一个数组, 提供了相关的添加、删除、修改、遍历等.

    ArrayList实现了RandmoAccess接口, 即提供了随机访问功能. RandmoAccess是java中用来被List实现的, 为List提供快速访问功能的. 在ArrayList中, 可以通过元素的序号快速获取元素对象, 这就是快速随机访问.

    ArrayList实现了Cloneable接口, 即覆盖了函数clone(), 能被克隆.

    ArrayList实现java.io.Serizlizable接口, 这意味着ArrayList支持序列化, 能通过序列化去传输.

    1.ArrayLIst底层用数组实现

    Java集合之ArrayList

     

    其他字段:

    Java集合之ArrayList

     

    2.构造函数

    Java集合之ArrayList

     

    Java集合之ArrayList

     

    Java集合之ArrayList

     

    3.存储

    ArrayList提供了多种添加元素的方法.

    (1)add(E e)方法, 将指定元素添加到列表的尾部. 当容量不足时, 调用 grow 增长容量.

    Java集合之ArrayList

     

    可以看到, 方法核心内容就是 ensureCapacityInternal 方法. 用于调整数组容量, 这个函数就是 自动扩容机制的核心. 其实现如下:

    Java集合之ArrayList

     

    Java集合之ArrayList

     

    也就是说, 当增加数据时, 若ArrayList大小不够了, 那么将数组扩容为原来的1.5倍.

    (2)add(int, E)在指定位置插入元素

    Java集合之ArrayList

     

    (3)set(int, E)将指定位置的元素替换, 返回旧的元素的值

    Java集合之ArrayList

     

    (4)addAll(Collection)将指定Collection中的元素添加到末尾

    Java集合之ArrayList

     

    (5)addAll(int, Collection)将指定Collection中的元素添加到指定位置

    Java集合之ArrayList

     

    方法基本都大同小异, 重要的就是为数组扩容

    4.读取

    读取的方法就比较简单了, ArrayList 能够支持随机访问的原因也是很显然的, 因为它内部的数据结构是数组, 而数组本身就是支持随机访问

    Java集合之ArrayList

     

    5.删除

    (1)remove(int)删除指定下标的元素并返回

    Java集合之ArrayList

     

    (2)remove(Object)删除指定的元素, 返回是否成功(布尔值)

    Java集合之ArrayList

     

    Java集合之ArrayList

     

    删除数组中的元素, 会将元素后面的所有元素向左移动一个位置.

    6.调整数组容量

    ensureCapacity 方法用于调整数组的容量

    Java集合之ArrayList
  • 相关阅读:
    iOS block的用法
    ios-AutoLayout(自动布局代码控制)简单总结
    iOS动画浅汇
    AutoLayout的那些事儿
    ffmpeg合并多个视频
    Win7下安装配置Java
    Linux + Apache + PHP 环境搭建
    Python操作excel文件
    Python文件打包成EXE文件
    Vim插件管理 -- Vundle
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10181573.html
Copyright © 2011-2022 走看看