public class xjhArrayList <E>{
private Object[] elementData;//定义一个数组,底层
private int size=0;//表示目前容器内元素的个数
private static final int DEFAULT_SIZE=10;//数组默认大小
public xjhArrayList(){//无参构造
elementData=new Object[DEFAULT_SIZE];
}
public xjhArrayList(int capacity ){//有参构造,自定义初始数组大小
if(capacity<0){throw new RuntimeException("容器大小不能为负数");}
else{
elementData=new Object[capacity];
}
}
public void add(E e){
if(size==elementData.length){//当添加的元素个数超过原始数组大小时进行扩容操作
Object[] newArray=new Object[elementData.length<<1];//左移一位,新数组比旧数组大一倍
System.arraycopy(elementData,0,newArray,0,elementData.length);
//调用系统数组拷贝函数,完成新数组对老数组的拷
elementData=newArray;//替换老数组,原对象被系统回收
}
elementData[size++]=e;//size从0开始自加 先赋值否则应该是++size
}
@Override
public String toString() {//重写toString方法,容器输出
StringBuilder sb=new StringBuilder();//用StringBuilder存储并输出
sb.append("[");
for (int i = 0;i<size ; i++) {
sb.append(elementData[i]+",");
}
sb.setCharAt(sb.length()-1,']');//【】格式输出
return sb.toString();
}
public Object get(int index){//定义get函数,返回泛型类型
if(index>=0&&index<elementData.length){//判断索引是否合法
return elementData[index];}
else throw new RuntimeException("下标值越界");
}
public void set(E element,int index){
if(index>=0&&index<elementData.length){
elementData[index]=element;
}
else throw new RuntimeException("下标值越界");
}
/** 小技巧:在这里可以统一定义一个下标检查函数,若下标越界则抛出异常,这样就让上面两个方法精简*/
public void remove(E element){//将传入元素与容器内元素依次比较
for (int i = 0; i <size ; i++) {
if(element.equals(get(i))){//若传入元素与内部相等,则调用移除,容器内比较用equals
removes(i);
}
}
}
public void removes(int index){
if(index<size-1) {
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
elementData[size - 1] = null;//将末尾置空
size--;//将末尾删除
}
if(index==size-1){
elementData[size-1]=null;
size--;
}
}
}
只是为了练手
设计主类测试
xjhArrayList <Integer> x=new xjhArrayList<>();//定义一个xjhArrayList类型的容器
for (int i = 0; i <10 ; i++) {
x.add(i);
}
System.out.println(x.toString());
x.set(2,0);
x.remove(2);