用数组简单实现ArrayList
- 容器是什么?
简单来说容器相当于一个Box,其中的List、Set、Queue和Map这些基本类型,方便在容器内进行反复存删的操作
1.1为什么需要容器?
在端与端之间的传输中,需要Java临时存储数据。
- ArrayList的初始化
2.1 ArrayList和List的区别:
List是一个接口,ArrayList是List的一个实现类

2.2 ArrayList就是一个简单的类,我们简单的用数组实现ArrayList,先看一段代码

首先:先执行MyArrayListUser
当看到new这个关键字的时候,首先先想到在堆内存中开辟了一块存储空间

注:有些方法区的位置存放于堆上,有些版本的方法区存放于堆外
既然是new出的对象,我们直接看构造函数

为什么底层要用数组实现呢?
同时我们也可以看一下ArrayList的源码,他到底干了什么?

是的,ArrayList和String一样底层也是数组实现的,唯一的区别是String底层是char[]数组,而这儿是Object[]数组
读到这里,小伙伴们应该有三大疑惑?
1:为什么底层要用数组,同时衍生到String字符串的底层为什么用数组
2:为什么底层要用Object数组
3:为什么我给他赋值给10
1:因为没有别的实现方法
1.1:因为String不变性,数组只能存储字符,数组的长度也是不可变的,如果相变只能扩容
2:因为Object类是所有类的基类,Object类是所有类的父类
3:不知道,以后再说
而这里的Object[]数组,可以存放任何对象,执行完构造函数后

继续执行:
oml.add("123");
oml.add("456");
oml.add("789");

不多说,看咱们的源码MyArrayList是怎么处理add的。

哪了解数组是怎么扩容的呢?扩多大呢?

我这里用的是创建一个新数组,然后把内容扩两倍,把新数组内容放入老数组中

将创建一个新数组,并将旧数组的内容复制过来。,那么旧数组会在内存中还是删除后会发生什么呢?
ArrayList释放了对旧数组的引用,旧数组将会被GC回收
为什么扩容需要扩1.5倍呢?
这个问题留给观众
在ArrayList源码中

这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但性能会好一些。
传递的过程中就是把obj的地址赋值给arr

同样的,还有其他ArrayList的方法,因为过于简单所以就不叙述了

浙公网安备 33010602011771号