ArrayList原理(一)
需要使用到动态数组的时候用的最多的就是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原理(一)的更多相关文章
- Java集合 ArrayList原理及使用
ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...
- ArrayList原理解析
简介 ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处 有图有码 图 ...
- ArrayList 原理(1)
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- 「必知必会」最细致的 ArrayList 原理分析
从今天开始也正式开 JDK 原理分析的坑了,其实写源码分析的目的不再是像以前一样搞懂原理,更重要的是看看他们编码风格更进一步体会到他们的设计思想.看源码前先自己实现一个再比对也许会有不一样的收获! ...
- 一.ArrayList原理及实现学习总结
一.ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组.与Java中的数组相比,它的容量能动态增长.类似于C语言中的动态申请内存,动态增长内存. 当创 ...
- ArrayList 原理(2)
1. 概述 关于Java集合的小抄中是这样描述的: 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预 ...
- ArrayList原理分析(重点在于扩容)
首先,ArrayList定义只定义类两个私有属性: /** * The array buffer into which the elements of the ArrayList are stored ...
- 容器ArrayList原理(学习)
一.概述 动态数组,容量能动态增长,元素可以为null,用数组存储,非线程同步(vector线程同步) 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,自动增长(默 ...
- Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项
迭代器在变量元素的时候要注意事项: 在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作. 如果使用过了集合对象改变集合中元素个数那 ...
随机推荐
- poj1054 The Troublesome Frog 瞎搞。
连接:http://poj.org/problem?id=1054 题意:就是一个格子里一条线上最长有几个青蛙(青蛙间隔相同)~.但是其实青蛙的起点重点必须是在外面. 直接写一个搜就是. #inclu ...
- 第13课:HTML基础之DOM操作2
1. 1)d.innerHTML:标签中的所有内容 删除某个标签 a)可以直接修改innerHTML的值: b) 2)d.innerText:标签中的文本内容 3)input.value='aaa' ...
- java并发编程之二--CountDownLatch的使用
CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...
- 如何在未越狱的ios系统安装ipa文件
首先我们先下载一个PP助手正版在电脑上 用iphone打开http://z.25pp.com/?from=bdpz,根据网页上的教程,我们安装好PP助手正版(注意是正版!!) 将手机连接电脑,在电脑上 ...
- 每天一个linux命令(网络):【转载】ifconfig命令
许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...
- JFreeChart的简单使用
实例1:简单的饼图 public class Test { public static void main(String[] args) { //建立默认的饼图 DefaultPieDataset d ...
- Visual C++2013 使用技巧
对 Visual Studio 2013 的 IDE 不熟悉.刚用VS 中的 VC++ IDE 进行编程,一些东西用得少,或以后久了不用,怕又忘了.现在慢慢知道点,记录点,以备以后查阅. 1. 记编译 ...
- python functiontools 模块
一个内置的模块. 作用是实现了更多的功能, 同时形式上显得很简洁. 虽然在使用很方便, 但其中的原理还是很难复杂的. ------------------------------------- ...
- Phonegap 事件机制
PhoneGap事件包含另个部分,一个是传统网页触发的事件,比如DOM加载,超链接,form表单提交事件等. 另一个是PhoneGap独有的事件.如 deviceready:只在设备在本地环境和页面完 ...
- WCF揭秘学习笔记(3):使用DataContractSerializer
使用DataContractSerializer 终结点(包括地址.绑定.契约)可通过代码以编程方式添加到服务中.如: using(ServiceHost host =new ServiceHost( ...