手写ArrayList
1.首先编写ExtList接口()
package com.itmayiedu.list;
public interface ExtList<E> {
public void add(E object);
public void add(int index, E object);
public Object remove(int index);
public boolean remove(E object);
public int getSize();
public Object get(int index);
}
2.然后再编写实现类ExtArrayList
package com.itmayiedu.list;
import java.util.Arrays;
public class ExtArrayList<E> implements ExtList<E>{
//保存ArrayList中数据的数组
private transient Object[] elementData;
//ArrayList实际数量
private int size;
public ExtArrayList(){
this(10);
}
public ExtArrayList(int initialCapacity){
if(initialCapacity<0){
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
}
//初始化数组 容量
elementData=new Object[initialCapacity];
}
//添加
public void add(Object object){
//size+1,如果数组容量不够就扩容
ensureExplicitCapacity(size+1);
elementData[size++]=object;
}
public void add(int index, E object) {
rangeCheck(index);
ensureExplicitCapacity(size+1);
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index]=object;
size++;
}
//确保数组的容量充足,扩容
private void ensureExplicitCapacity(int minCapacity) {
// 如果存入的数据,超出了默认数组初始容量 就开始实现扩容
if(size==elementData.length){
//获取原来数组的长度为2
int oldCapacity=elementData.length;
// oldCapacity >> 1 理解成 oldCapacity/2 新数组的长度是原来长度1.5倍
int newCapacity=oldCapacity+(oldCapacity>>1);
if(newCapacity<minCapacity){
// 最小容量比新容量要小的,则采用初始容量minCapacity
newCapacity=minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
public Object remove(int index) {
Object object=get(index);
int numMoved=elementData.length-index-1;
if(numMoved>0){
System.arraycopy(elementData, index+1, elementData, index,numMoved);
}
elementData[--size]=null;
return object;
}
public boolean remove(E object) {
for(int i=0;i<elementData.length;i++){
Object element=elementData[i];
if(element.equals(object)){
remove(i);
return true;
}
}
return false;
}
public int getSize() {
return size;
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
private void rangeCheck(int index) {
if(index>=size){
throw new IndexOutOfBoundsException("数组越界啦!");
}
}
}
3.编写测试类TestList
package com.itmayiedu.list;
public class TestList {
public static void main(String[] args) {
ExtArrayList<String> extArrayList = new ExtArrayList<String>();
extArrayList.add("张三");
extArrayList.add("李四");
extArrayList.add("王武");
extArrayList.add(1,"古天乐");
System.out.println("数组的长度"+extArrayList.getSize());
System.out.println("获取第一个元素值:" + extArrayList.get(0));
System.out.println("获取第二个元素值:" + extArrayList.get(1));
System.out.println("获取第三个元素值:" + extArrayList.get(2));
System.out.println("获取第四个元素值:" + extArrayList.get(3));
}
}