需要使用到动态数组的时候用的最多的就是ArrayList了,底层其实是Object数组,以下demo基于JDK1.8:

List<Integer> list  = new ArrayList<>();

list.add(1);
list.add(3);
list.add(2);
list.add(4);
list.add(7);
list.add(5);
list.add(6);
list.add(2);
list.add(2);
list.add(2);
list.remove(1);

普及小知识点

length:数组的长度length是数组申请的大小,不管有没有值例如Object[] a = new Object[10];数组a的length就是10

size:是list的概念,表示list有效数组的大小,可能一开始list申请了10个大小的Object数组,然后只add了一个数,这个时候length是10,size是1

native:非java语言写的代码,dll文件

首先看add()函数

ensureCapacityInternal看数组需不需要增加保证有位置插入新的值,然后将要插入的值添加到数组中去

点进去ensureCapacityInternal,其实用到了两个函数ensureExplicitCapacity,calculateCapacity,首先看calculateCapacity

看函数的名字也知道计算容器空间就是数组的大小,这里的思路是数组如果为{},就在10和minCapacity)直接选个大的数返回,否则返回minCapacity,经过一顿骚操作后得到一个数值,传入ensureCapacityInternal函数,就是要生成数组的函数。

然后这里modCount++,modCount是记录操作的次数,还有一个expectedModCount,后面如果对比两个值不一样的时候会抛异常(另说)

然后判断minCapacity最小容器大小是不是比原来的数组的length大,如果大也就是原来的数组装不下新值了怎么办,那就调用grow函数把数组变大

grow函数也很简单记录原始数组的长度,然后新建一个数字newCapacity是原始数组长度的1.5倍(oldCapacity >> 1右移一位就是除以二),如果newCapacity比传入的minCapacity,就等于minCapacity,如果比MAX_ARRAY_SIZE大(可以理解为很大),就给它一个很大的数组空间,然后调用Arrays.copyOf()函数生成新的数组,通俗的讲就是如果你要grow数组的大小,可以我默认就给你增加到原来的1.5倍,什么你告诉我minCapacity比原来的1.5倍还要大,好那听你的用minCapacity,什么你需要申请的数组大小很大很大就给你一个huge的数组,然后我们调用Arrays.copyOf实际生成需要的数组,然后看copyOf()函数

点进去继续看return的copyOf函数

这个函数也很简单,就是新建一个copy数组其实就是我们要生成的数组,如果newType是Object类型就新建一个Object的数组,长度是newLength(这里的newType其实就是original.class,就是原始数组的类型的class,newLength就是希望创建的数组的大小),如果原始数组不是Object的就调用Array.newInstance方法生成数组实例,点进去

继续点击进去newArray方法

其实调用的就是底层的native方法,native方法就是不是java语言写的方法,例如可能你调用的是dll文件,就是说你不是Object可能就是其他语言支持的一些类型了

然后继续往后看System.arraycopy

System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));

点进去

其实就是一个native方法

src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。

直接调用System.arraycopy的话,这里copy的时候如果是两个不同数组还好就是copy,如果传入的是同一个数组实际是对同一个数组进行操作

总的来说就是封装了数组,让我们用起来方便一些没什么,溜了

ArrayList原理(一)的更多相关文章

  1. Java集合 ArrayList原理及使用

    ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...

  2. ArrayList原理解析

    简介 ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处 有图有码 图 ...

  3. ArrayList 原理(1)

    ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...

  4. 「必知必会」最细致的 ArrayList 原理分析

      从今天开始也正式开 JDK 原理分析的坑了,其实写源码分析的目的不再是像以前一样搞懂原理,更重要的是看看他们编码风格更进一步体会到他们的设计思想.看源码前先自己实现一个再比对也许会有不一样的收获! ...

  5. 一.ArrayList原理及实现学习总结

    一.ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组.与Java中的数组相比,它的容量能动态增长.类似于C语言中的动态申请内存,动态增长内存. 当创 ...

  6. ArrayList 原理(2)

    1. 概述 关于Java集合的小抄中是这样描述的: 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预 ...

  7. ArrayList原理分析(重点在于扩容)

    首先,ArrayList定义只定义类两个私有属性: /** * The array buffer into which the elements of the ArrayList are stored ...

  8. 容器ArrayList原理(学习)

    一.概述 动态数组,容量能动态增长,元素可以为null,用数组存储,非线程同步(vector线程同步) 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,自动增长(默 ...

  9. Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项

    迭代器在变量元素的时候要注意事项: 在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作.   如果使用过了集合对象改变集合中元素个数那 ...

随机推荐

  1. Meteor.js异步全解

    翻译来源: http://phucnguyen.info/blog/everything-you-need-to-know-about-async-meteor/ posted in Web Deve ...

  2. sgu 142. Keyword 暴力,hash 难度:0

    142. Keyword time limit per test: 0.5 sec. memory limit per test: 16384 KB Kevin has invented a new ...

  3. hdu 6158 The Designer( 反演圆)

    The Designer Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. Delphi 简体 繁体 转换

    http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=104986 試看看 這個是豬寶寶從網路上抄來的 檢視純文字版列印? fun ...

  5. 在jenkins和sonar中集成jacoco(一)--使用jacoco收集单元测试的覆盖率

    之前系统的持续集成覆盖率工具使用的是cobetura,使用的过程中虽然没什么问题,但感觉配置比较麻烦,现在准备改用jacoco这个覆盖率工具来代替它.接下来我介绍一下jenkins配置jacoco,并 ...

  6. java基础第9天

    抽象 abstract 抽象类和抽象方法必须用abstract关键字修饰 抽象类格式 abstract class 类名{} 抽象方法定义,在返回值钱,或修饰符前加上abstract关键字 方法没有方 ...

  7. SpringInAction--SpringMvc高级技术(servlet、filter、multipart)

    前面学了spirng的一些配置,以及web方面的知识,今天就在学习一下在spring比较常用的一些高级技术... 首先来介绍下什么叫servlet吧(来着维基百科) Servlet(Server Ap ...

  8. Alpha阶段第1周Scrum立会报告+燃尽图 01

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 ...

  9. ConfigurationManager 引用

    即使在代码中添加了using System.Configuration 也不会自动出来ConfigurationManager, 需要到项目的Reference手动引用Configuration的dl ...

  10. 【整理】简单的数学期望和概率DP

    数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...