当前位置: 首页 > news >正文

ArrayList 源码分析 基于jdk1.8:

1:数据结构:

transient Object[] elementData;  //说明内部维护的数据结构是一个Object[] 数组

   成员属性:

private static final int DEFAULT_CAPACITY = 10;  

private static final Object[] EMPTY_ELEMENTDATA = {};  //空数组

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默认空数组

transient Object[] elementData;  //维护数组的引用

private int size;   //数组长度

2:构造方法:

public ArrayList() {

        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; //构造长度为0的Object[]  赋值给elementData,用于后面保存数据

}

3:主要方法的分析: add  get   remove  add(int index,Object o)

1)       add:  以添加第一个元素为例

   public boolean add(E e) { e=”aa”

        ensureCapacityInternal(size + 1);  // size=0

        elementData[size++] = e;

        return true;

}

 

private void ensureCapacityInternal(int minCapacity) {  // minCapacity=1

        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //第一个元素 true

            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //取 DEFAULT_CAPACITY

        }

 

        ensureExplicitCapacity(minCapacity);

    }

下面进入ensureExplicitCapacity 分析

private void ensureExplicitCapacity(int minCapacity) {

        modCount++;

 

        // overflow-conscious code

        if (minCapacity - elementData.length > 0)  //10-0=10

            grow(minCapacity);  //进入扩容的方法

    }

 

 

 

 

以下是扩容的方法:

private void grow(int minCapacity) {  // minCapacity=10

        // overflow-conscious code

        int oldCapacity = elementData.length;  // oldCapacity=0

        int newCapacity = oldCapacity + (oldCapacity >> 1);  //移位操作,移位后newCapacity=0

        if (newCapacity - minCapacity < 0)   //0-10=-10

            newCapacity = minCapacity;    // newCapacity=10

        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); //将旧数组中的内容拷贝到新的数组中  并且将新的数组赋值给elementData

    }

 

扩容机制:

int newCapacity = oldCapacity + (oldCapacity >> 1);  //将新数组扩容为原先数组的1.5倍长度

 

2):add(int index,Object o)方法分析

主要的实现方法如下:

public void add(int index, E element) {  // index1

        rangeCheckForAdd(index);   //和add方法里的一直

 

        ensureCapacityInternal(size + 1);  //和add方法里的一直

        System.arraycopy(elementData, index, elementData, index + 1,

                         size - index);  //主要是这里实现的index后面元素的拷贝

        elementData[index] = element;

        size++;

    }

下面分析这句代码实现的效果

System.arraycopy(elementData, index, elementData, index + 1,

                         size - index);

原始数组的结构和数据:

 
  

 

 

 

System.arraycopy方法执行后的数据结构 将 b2,b3 往后复制元素

 

 
  

 

 

 

最后将index处的元素赋值

elementData[index] = element;

这就是在具体索引进行add 的方法,往后的元素进行拷贝,导致消耗比较大

 

3):get方法:

public E get(int index) {

        rangeCheck(index);   //检查数组是否越界

 

        return elementData(index); //返回数组的index 索引出的元素

    }

 

 

Get 方法比较简单,就不做过多分析了

转载于:https://www.cnblogs.com/beppezhang/p/11214479.html

相关文章:

  • ConcurrentHashMap 源码分析,基于JDK1.8
  • CopyOnWriteArrayList 源码分析 基于jdk1.8
  • CopyOnWriteArraySet 源码分析
  • CountDownLatch 源码分析
  • HashMap 源码分析 基于jdk1.8分析
  • ReentrantLock 锁释放源码分析
  • ReentrantReadWriteLock 源码分析
  • 线程池 ThreadPoolExecutor 类的源码解析
  • 线程池的状态整理
  • 004 DOM01
  • Idea 2018版破解
  • windows如何解除端口占用?
  • Luogu3919 【模板】可持久化数组(主席树)
  • Red Hat开发最新Linux操作系统桌面linux操作系统
  • css核心属性
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ESLint简单操作
  • FastReport在线报表设计器工作原理
  • JavaScript-Array类型
  • JavaScript设计模式之工厂模式
  • JavaScript中的对象个人分享
  • laravel5.5 视图共享数据
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • node入门
  • PermissionScope Swift4 兼容问题
  • Python爬虫--- 1.3 BS4库的解析器
  • SQLServer插入数据
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue-router的history模式发布配置
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 从PHP迁移至Golang - 基础篇
  • 服务器之间,相同帐号,实现免密钥登录
  • 猴子数据域名防封接口降低小说被封的风险
  • 老板让我十分钟上手nx-admin
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 模型微调
  • 前端之Sass/Scss实战笔记
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 从如何停掉 Promise 链说起
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ![CDATA[ ]] 是什么东东
  • #FPGA(基础知识)
  • #if 1...#endif
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (1)(1.11) SiK Radio v2(一)
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (四)模仿学习-完成后台管理页面查询
  • (转)JAVA中的堆栈
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net Remoting常用部署结构