ArrayList部门一共五篇文章了,而且引入了时间巨大度来阐明,强烈发起各人必然要按顺序阅读,本文是第1篇。
前些天的文章,重复的绘图,不断的反复,就是想让各人领略,工具在内存中是什么样的。也是为本日的及今后的讲授打下基本。假如要说各人在写Java代码的时候哪个类用得最多,我想除了String,根基上就是ArrayList了吧,那本日我们说说ArrayList。
首先ArrayList是一个普通的类,我们来看一段代码:
首先:执行List<Person> list1 = new ArrayList<>();当看到new这个要害字的时候,我们脑壳里应该第一印象就是这货在堆内存开发了一块空间,好我们再来画一画。
注:常量池位于要领区,要领区位于堆内存,前面没涉及到,所以没画要领区,此刻补上
好,既然是new出来的,那我们直接从结构函数入手,看一下结构函数做了什么。
很简朴,就一行代码,继承看一下,this.elementData和DEFAULTCAPACITY_EMPTY_ELEMENTDATA别离是什么
红框里的内容是不是似曾领会?是的,和String一样,底层是数组,独一的区别是String底层是char[]数组(忘了的可以温习一下,传送门:String是一个很普通的类 – Java那些事儿),而这儿是Object[]数组,也就是说该数组可以放任何工具(所有工具都担任自父类Object),执行完结构函数后,如下图。
注:static修饰的变量,常驻于要领区,我们不需要new,JVM会提前给我们初始化好,这个特性在实际开拓进程中,常常拿来做缓存。在让人迷惑的Java代码 – Java那些事儿 一文中,我们文中Integer的缓存就是最好的例子。static变量又叫类变量,软件开发,不管该类有几多个工具,static的变量只有一份,唯一无二。
fianl修饰的变量,软件开发,JVM也会提前给我们初始化好。
transient这个要害字汇报我们该工具在序列化的时候请忽略这个元素,后续我们会讲序列化,这儿先跳过。
继承执行:List<Person> list2 = new ArrayList<>();
ArrayList这个类的作者真是好贴心,new的时候连缓存都思量到了,为了制止我们重复的建设无用数组,所有新new出来的ArrayList底层数组都指向缓存在要领区里的Object[]数组。
继承执行Person person1 = new Person(“张三”)
继承,执行list1.add(person1),不多说,看源码ArrayList是怎么处理惩罚add的。
我们先看ensureCapacityInternal要领,要领里有个参数是size,看们先看一下这个size从哪来的。
本来是一个成员变量,相信各人看到size一猜就知道或许是干嘛的了吧。好,我们在图里的ArrayList工具里补上它,size是int根基数据范例,成员变量初始化的为0。
继承往下看
ensureCapacityInternal要领是在add内里挪用的。
再看grow要领
跟进到Arrays这个东西类,很简朴