一,ArrayList
实现自己的ArrayList:主要是添加方法,理解自动扩容机制
代码+注释:
package com.amazing.jdk.learn2List.list_08_13;
/**
* 1.实现ArrayList接口的增删改查方法
* 2.理解自动扩容机制
*参考:http://blog.youkuaiyun.com/u011240877/article/details/52802849
*/
public class MyArrayList<E> {
//需要扩容的数组
transient Object[] elementData;
//数组里的元素个数
private int size;
public boolean add(E o) {
/*
1.先判断一下,不然会报空指针
*/
if(elementData==null){
elementData=new Object[]{};
size=0;
}
/*
2.再判断当数组被元素填满时,扩容
*/
if(size==elementData.length){
//3.定义一个数组接收原来数组的元素
Object[] oldData=elementData;
//4.扩容1.5倍
int newCapacity=(elementData.length*3)/2;
if(newCapacity<size) newCapacity=size;
//5.定义一个新长度的数组
elementData=new Object[newCapacity];
//6.复制
System.arraycopy(oldData,0,elementData,0,size);
}
elementData[size++] = o;
return true;
}
public int size(){
return size;
}
public E get(int index){
return (E) elementData[index];
}
public void clear(){
for(int i=0;i<size();i++){
elementData[i]=null;
}
size=0;
}
/*
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,比如:
int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos
到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).
*/
}