介绍数组
数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。
因为int占4个字节,所以也可以理解为占四块内存
数组如何获取其他元素的地址值
为什么数组索引从0开始呢?假如从1开始不行吗?
在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引乘以存储数据的类型大小
如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令,性能不高。
操作数组的时间复杂度(插入,删除)
操作数组的时间复杂度(查询)
总结
源码分析
一般来说问的比较多的就是,添加数据的逻辑,如果添加多个数据,他的扩容方式
成员变量
构造函数
关键方法
添加和扩容操作(第1次添加数据)
第一步,ensureCapacityInternal(size + 1); 确保内部的容量,第一次添加数据的时候,size的默认值是0,+1的操作,不就是1了
第二步,内部有调用了calculateCapacity(elementData, minCapacity));意思是计算容量。elementData是我们的成员变量,minCapacity就是我们刚刚传过来的1
第三步,因为我们调用了无参的构造方法,所以此时elementData 是等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA
第四步,ensureExplicitCapacity(int minCapacity) 确认明确容量,因为我们是第一次添加,elementData里面是空的,所以我们需要扩容,他就会找grow方法
第五步,先拿到数组的容量,并且赋值给oldCapacity,现在数组容量是0,赋值给old,还是0,第二行进行扩容,右移一位,除以2,所以新容量还是0,然后第一个if语初始化数组长度,0-10<10。第二个if语句主要是一个安全判断,判断数组是否过大。最后执行elementData = Arrays.copyOf(elementData, newCapacity);进行数组拷贝,初始化数组,长度是10,并且赋值给elementData
第六步,elementData[size++] = e;将你传进来的值通过下标放到数组中,并且当前元素个数size+1,最后返回一个true。
添加和扩容操作(第2至10次添加数据)
因为我们第一次添加数据,已经将数组初始化长度为10了,这时候添加数据,如果不超过10,是不需要扩容数组,假如现在是第10次添加数据了
第一步size此时是9,+1之后才是10,这个10往下传递
第二步依然要确保内部的容量,然后调用计算容量的方法,在计算容量时依然是10
第三步,确认容量,接收了参数10,判断if语句,在2到10的过程中,-10一直是<=0的,所以不会扩容,直接往数组中添加数据就行了,这就是在不扩容的情况下操作集合
添加和扩容操作(第11次添加数据)
当你添加第11给元素的时候,会先去确保内部容量,此时minCapacity是11,此时又走到计算容量返回11,在确保容量的方法中,11-10>0所以需要扩容
在扩容方法中,old是10,new等于10+10/2=15,所以容量变为原来的1.5倍