手动实现ArrayList容器的部分,加深对底层的理解
package cn.sxau.mycollection;
import javax.management.RuntimeErrorException;
/**
* 手动生成ArrayList4.0
* 增加删除方法
* 增加set get方法
* 增加数组边界的检查
*增加数组扩容
* @author 王村长
*
*/
public class SxauArrayList05<E> {
private Object[] elementData;//核心数组
private int size;//表示数组里的元素数
//默认数组容量为10
private static final int DEFALT_CAPACITY=10;
//默认构造器
public SxauArrayList05(){
elementData=new Object[DEFALT_CAPACITY];//默认长度为10
}
//有参构造器,自定义容量
public SxauArrayList05(int capacity){
//检查容量
if(capacity<0){
throw new RuntimeException("容器容量不能为负数");
}else if(capacity==0){
elementData=new Object[DEFALT_CAPACITY];
}else{
elementData=new Object[capacity];
}
}
//返回size
public int size(){
return size;
}
//自定义add方法
public void add(E element){
//考虑是否需要扩容
if(size==elementData.length){//每增加一个数,size就要加1,当size的值等于数组的长度时,说明数组已经满了
//如何扩容?定义一个更大的数组
Object[] newarray=new Object[elementData.length<<1];//左移一位,新数组容量是原来的二倍
//利用数组的arraycopy方法转移数组
System.arraycopy(elementData, 0, newarray, 0, elementData.length);
//把新数组对象的地址赋值给旧的数组,这样新数组的引用指向的是新数组的内容
elementData=newarray;
//实现扩容
}
elementData[size++]=element;//size默认值是0,相当于把obj赋值给了elementDate[0]
}
//增加get方法,可以获取数组中指定索引的值,返回值为泛型
public E get(int index){
//检查索引
checkIndex(index);
return (E)elementData[index];
}
//增加set方法,可以设置数组中指定索引的值,不需要返回值,并且检查索引值
public void set(E element,int index){
//检查索引
checkIndex(index);
elementData[index]=element;
}
//添加检查索引值方法
public void checkIndex(int index){
//索引在[0,size)间为合法索引
if(index<0||index>size-1){
throw new RuntimeException("该索引不合法"+index);
}
}
//添加remove方法
public void remove(E element){
//将element与数组元素一次比较,获取第一个比较结果为true的值
for(int i=0;i<size;i++){
if(element.equals(get(i))){
//将该元素从此处移除
remove(i);
}
}
}
//移除指定索引的位置
public void remove(int index){
//删除的本质是数组的拷贝
int num=elementData.length-index-1;
if(num>0){
System.arraycopy(elementData, index+1, elementData, index,num);
}
elementData[--size]=null;
}
//改写tostring方法
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("[");//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) {
}
}