package Study.Collection;
import java.util.ArrayList;
/**
* <p>Description: </p>
* 数组扩容实现
* @author zhangyan
* @date 2018/12/19 11:18
*/
public class YanArrayList02<E> {
private Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10 ;
public YanArrayList02(){
elementData = new Object[DEFALT_CAPACITY];
}
public YanArrayList02(int capacity) {
elementData = new Object[capacity];
ArrayList l;
}
//实现数组扩容
public void add(E element){
//判断
if(size == elementData.length){
//扩容操作,先定义一个更大的数组,左移动操作,
Object[] newArray = new Object[elementData.length+(elementData.length>>1)]; //10 变成10+10/2 =15
//拷贝,elementData数组到newArray数组,从0索引开始,考到0索引开始放,考elementDara.length个
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
//新数组赋值给老数组,老数组被GC
elementData = newArray;
}
elementData[size++] = element;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++){
sb.append(elementData[i]+",");
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args) {
YanArrayList02 s1 = new YanArrayList02();
for(int i=0;i<400;i++){
s1.add("baba "+i);
}
System.out.println(s1);
}
}
解析:实现数组扩容具体的方法具体看代码中add()的注释。
思想是:
- 1,定义一个扩容之后的新数组;
- 2,如果老数组超过了之前的容量,就把老数组的数全部copy到新数组上 ;
- 3,老数组被GC