ArrayList部门一共五篇文章了,而且引入了时间巨大度来阐明,强烈发起各人必然要按顺序阅读,本文是第2篇,相关文章别离是:
1、ArrayList初始化 – Java那些事儿专栏
再次强调,ArrayList是一个普通的类,假如我们开心,可以本身写一个。
ArrayList初始化 – Java那些事儿专栏 文章颁发后,评论区有人问如下问题。
我们先回首一下之前的所说过的数组,话不多说,上代码:
老法则,我们继承画一画,加深一下印象,昆山软件开发,上图:
这个图我们去掉了ArrayList初探 – Java那些事儿专栏 一文图里那些无用的细节(要领区,常量池等),利便各人看起来清晰,我们用eclipse的debug成果看一下,看是否与我们图上画的一致
再看一下执行功效,也在我们期望中。
好,我们改一下代码,再往数组里加添加一个叫“周八”的person工具 执行一下 看到了传说的中数组下标越界异常。在Java中,数组一但在堆内存中建设,长度是牢靠的。既然是牢靠的,那我们要往数组里加一个“周八”用户怎么办?没步伐,只能从头new长一点的新的数组,把本来数组的元素复制已往,昆山软件开发,好吧,开始写代码吧,相信各人城市写
把老数组的元素轮回一下,赋值给新的数组,很简朴也很清晰。debug看一下 “周八”已经有了。以上代码固然简朴,但还不是最优雅的,老鸟一般会这么写,该段代码执行功效和上面那段代码一样。 再画个图加深一下印象吧: 此图已用尽我洪荒之力,但愿各人今后多想想工具在堆内存中的样子。不枉我一片苦心呀。看到System.arraycopy()要领是不是似曾领会呢?我们在ArrayList初探 – 知乎专栏 一文中提了一下,相信看到这里,各人都知道ArrayList里的底层数组扩容是怎么实现的了吧。在ArrayList初探 – 知乎专栏 一文中,我们知道当ArrayList假如不指定结构个数的话,第一次往内里添加元素时底层数组会初始化一个长度为10的数组,我们再回首一下昨天的源码,昆山软件公司,再来看一下ArrayList里的源码,当添加第11个元素时
再看grow()要领 这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但机能会好一些。 本文开始谁人问题,到这儿就办理了,这就是数组的扩容,一般是oldCapacity + (oldCapacity >> 1),相当于扩容1.5倍。看到这里,相信在今后的口试中,口试官再问数组和ArrayLIst的区此外时候,各人应该有了本身的领略,而不是去不和试题了。