Arraylist 的源码分析

 Arraylist 的源码分析

Arraylist 的源码分析

默认长度是是十个字节

Arraylist 的源码分析


这两个一个是默认的,一个是用来增长扩容的。

如果不写长度就是一个objec []

Arraylist 的源码分析

写了小于零就会抛出异常。

Arraylist 的源码分析


Arraylist 的源码分析

这表明是一个瞬态的

 Arraylist 的源码分析

先判断长度,在判断是否是空对象数组,如果不是自动扩容,长度就是参数集合的长度,

我们点击进去看一次copyarray 的源码

Arraylist 的源码分析 

使用了大量的泛型

如果都是object[]的类型,就直接的扩容。变成新的长度。

 Arraylist 的源码分析

不是的情况下回比较原始的和现在传进来的长度。新 new 数组

然后在执行

Arraylist 的源码分析

Arraycopy 的方法。

 Arraylist 的源码分析

去空先判断长度,在判断是否等于零

等于零就返回一个object[],不等于零在复制一个数组,类型还是原始的类型。

Arraylist 的源码分析

Arraylist 的源码分析

数组的长度已经超过限制就会报oom,因为新建数组的时候jvm 会自动的分配内存。

我们来模拟一下

Arraylist 的源码分析

Arraylist 的源码分析

我们来看一下grow()这个方法

Arraylist 的源码分析

 

Arraylist 的源码分析


扩容1.5倍

 

如果小于最小的按照最小的,

如果大于最大的,调用hugeacpactiy()来判断,这个方法要判断是否OOM

Arraylist 的源码分析

 

如果大于最大的长度,取Integer.MAX_VALUE,否则就是取MAX_ARRAY_SIZE

Arraylist 的源码分析 

判断是否为空就是判断长度是否是零

判断是否包含

Arraylist 的源码分析

 

Arraylist 的源码分析


其实就是遍历获得下标来判断

获得最后的下标数,其实就是反过来。

 Arraylist 的源码分析                                                                                                             

这是克隆方法,底层也是复制,但是modcount给初始化了。

Arraylist 的源码分析

核心

Arraylist 的源码分析 

先区间检查

大于这个范围就报数组下标越界

Arraylist 的源码分析

 

Arraylist 的源码分析

 

就是根据下标从数组中取值。

 Arraylist 的源码分析

Arraylist 的源码分析

Add 这就说明是可以重复的,和value的值没关系。

 Arraylist 的源码分析

Arraylist 的源码分析