Arraylist 的源码分析
Arraylist 的源码分析
默认长度是是十个字节
这两个一个是默认的,一个是用来增长扩容的。
如果不写长度就是一个objec []
写了小于零就会抛出异常。
这表明是一个瞬态的
先判断长度,在判断是否是空对象数组,如果不是自动扩容,长度就是参数集合的长度,
我们点击进去看一次copyarray 的源码
使用了大量的泛型
如果都是object[]的类型,就直接的扩容。变成新的长度。
不是的情况下回比较原始的和现在传进来的长度。新 new 数组
然后在执行
Arraycopy 的方法。
去空先判断长度,在判断是否等于零
等于零就返回一个object[],不等于零在复制一个数组,类型还是原始的类型。
数组的长度已经超过限制就会报oom,因为新建数组的时候jvm 会自动的分配内存。
我们来模拟一下
我们来看一下grow()这个方法
扩容1.5倍
如果小于最小的按照最小的,
如果大于最大的,调用hugeacpactiy()来判断,这个方法要判断是否OOM
如果大于最大的长度,取Integer.MAX_VALUE,否则就是取MAX_ARRAY_SIZE
判断是否为空就是判断长度是否是零
判断是否包含
其实就是遍历获得下标来判断
获得最后的下标数,其实就是反过来。
这是克隆方法,底层也是复制,但是modcount给初始化了。
核心
先区间检查
大于这个范围就报数组下标越界
就是根据下标从数组中取值。
Add 这就说明是可以重复的,和value的值没关系。