1.1为什么需要容器?
在端与端之间的传输中,需要Java临时存储数据。
2.2 ArrayList就是一个简单的类,我们简单的用数组实现ArrayList,先看一段代码
首先:先执行MyArrayListUser
当看到new这个关键字的时候,首先先想到在堆内存中开辟了一块存储空间
注:有些方法区的位置存放于堆上,有些版本的方法区存放于堆外
既然是new出的对象,我们直接看构造函数
为什么底层要用数组实现呢?
同时我们也可以看一下ArrayList的源码,他到底干了什么?
是的,ArrayList和String一样底层也是数组实现的,唯一的区别是String底层是char[]数组,而这儿是Object[]数组
读到这里,小伙伴们应该有三大疑惑?
1:为什么底层要用数组,同时衍生到String字符串的底层为什么用数组
2:为什么底层要用ObjectS数组
3:为什么我给他赋值给10
1:因为没有别的实现方法
1.1:因为String不变性,数组只能存储字符,数组的长度也是不可变的,如果相变只能扩容
2:因为Object类是所有类的基类,Object类是所有类的父类
3:不知道,以后再说
而这里的Object[]数组,可以存放任何对象,执行完构造函数后
继续执行:
oml.add("123");
oml.add("456");
oml.add("789");
不多说,看咱们的源码MyArrayList是怎么处理add的。
哪了解数组是怎么扩容的呢?扩多大呢?
我这里用的是创建一个新数组,然后把内容扩两倍,把新数组内容放入老数组中
为什么扩容需要扩2倍呢?
在ArrayList源码中
这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但性能会好一些。
传递的过程中就是把obj的地址赋值给arr
同样的,还有其他ArrayList的方法,因为过于简单所以就不叙述了
原文:https://www.cnblogs.com/wfqblogs/p/14602969.html