简单总结复习刚学到的ArrayList扩容机制
什么是ArrayList?
ArrayList是java中集合的一种,实际上是一个动态数组,底层是用数组实现的,随机访问效率高,随机删除、修改效率低、线程不安全``
ArrayList扩容机制
打开idea中ArrayList类的源码,ArrayList中有两个属性,size:表示ArrayList的长度,elementData数组:用来存储数据的数组。
在Arraylist扩容时,调用Add方法,
###方法中会首先判断得到最小扩容量,如果你构造的ArrayList是用无参构造,即你创建ArrayList时没有确定它的长度,最小扩容量就为10和size+1当中的最大值,
###然后再判断是否需要扩容,如果最小扩容量大于elementData.length,就需要扩容,然后调用grow()方法,其中旧容量为elementData.length,新容量为elementData.length的1.5倍(new=old+old>>1),
##若新容量大于size+1,最小需要容量就为新容量,若新容量小于size+1,最小需要容量就为size+1,之后再将原来的数组用Arrays.copyOf方法复制到新数组,使新数组的长度为最小需要容量。
自己实现的扩容demo
package data.test;
import java.util.Arrays;
public class MyArrayList {
//保存数据的数组
private Object [] elementData;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//数组的长度
private Integer size;
public MyArrayList(){
elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public MyArrayList(Integer num){elementData=new Object[num];}
public boolean add(Object o){
Integer mincapity;
if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
mincapity=Math.max(10,size+1);
}
else {
mincapity=size+1;
}
need(mincapity);
elementData[size++]=o;
return true;
}
public void need(Integer mincapity){
if(mincapity<elementData.length){
return;
}
else {
grow(mincapity);
return;
}
}
public void grow(Integer mincapity){
Integer oldcapity=elementData.length;
Integer newcapity=oldcapity+(oldcapity>>1);
Integer needCapity;
if(size+1>newcapity){
needCapity=size+1;
}
else {
needCapity=newcapity;
}
Arrays.copyOf(elementData,needCapity);
}
}