接口:
package com.zhuzhu.arraylist;
/**
* <p>Title: ZhuzhuList</p>
* <p>Description: 自定义List接口</p>
* @author zhuzhu
* @date 2018年8月12日
*/
public interface ZhuzhuList<E> {
/**
* 返回List包含元素的个数
*/
int size();
/**
* 添加元素
*/
void add(E e);
/**
* 在index 添加元素
*/
void add(int index,E e);
/**
* 安坐标删除元素
*/
void remove(int index);
/**
* 安坐标获取元素
*/
E get(int index);
/**
* 判断List是否为空
*/
boolean isEmpty();
/**
* 清空数组
*/
void clear();
}
实现类
package com.zhuzhu.arraylist;
public class ZhuzhuArrayList<E> implements ZhuzhuList<E> {
/**
* 默认数组大小
*/
private static final int DEFAULT_CAPACITY=10;
/**
* 存数据的数组
*/
private Object[] elementData;
/**
* 默认容量的空数组
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA= {};
/**
* 数组的大小
*/
private int size;
public ZhuzhuArrayList() {
this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
@Override
public int size() {
return this.size;
}
@Override
public void add(E e) {
ensureCapacityInternal(size+1);
this.elementData[size++]=e;
}
@Override
public void add(int index, E e) {
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("请您输入正确的index");
}
//扩容
ensureCapacityInternal(size+1);
//移动数目
int numMove=size-index-1;
//移动
System.arraycopy(elementData, index, elementData, index+1, numMove+1);
//赋值
this.elementData[index]=e;
size++;
}
//确定内部容量
private void ensureCapacityInternal(int minCapacity) {
//初始化扩容
if(this.elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity=DEFAULT_CAPACITY;
}
ensureExplicitCapacity(minCapacity);
}
//确认扩容
private void ensureExplicitCapacity(int minCapacity) {
if(elementData.length<minCapacity) {
grow(minCapacity);
}
}
//扩容
private void grow(int minCapacity) {
int oldCapacity=elementData.length;
//扩容1.5倍
int newCapacity=elementData.length+(oldCapacity>>1);
//第一次
if(newCapacity<minCapacity) {
newCapacity=minCapacity;
}
//扩容 arraycopy(Object src, int srcPos,Object dest, int destPos, int length);
Object[] array=new Object[newCapacity];
//扩容
System.arraycopy(elementData, 0, array, 0, elementData.length);
this.elementData=array;
}
@Override
public void remove(int index) {
rangeCheck(index);
//移动的距离
int numMove=size-index-1;
//移动
System.arraycopy(elementData, index+1,elementData, index, numMove);
this.elementData[--size]=null;
}
@SuppressWarnings("unchecked")
@Override
public E get(int index) {
rangeCheck(index);
return (E) elementData[index];
}
private void rangeCheck(int index) {
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException("请您输入正确的index");
}
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void clear() {
for(int i=0;i<size;i++) {
this.elementData[i]=null;
}
this.size=0;
}
}