简化实现了ArrayList的底层结构,提供构造,增删改查,越界判断等功能
没有加泛型的版本:
/**
* 自己实现一个ArrayList,复习底层结构
* @author majinbuu
*
*/
public class List0 { //通配符E表示泛型
private int SIZE; //size的默认初始值是0,一开始没放东西进去
private Object[] element; //ArrayList的元素都为Object类型
private static final int DE_SIZE=10; //数组默认长度
//构造函数前加public
public List0(){ //无参构造函数
element=new Object[DE_SIZE];
}
public List0(int creat_num) { //有参构造函数
element=new Object[creat_num];
}
/**
//add方法(没有数组自动扩容功能):
public void add(Object obj) {
element[SIZE++]=obj;
}
*/
//具有数组自动扩容功能的add方法:
public void add(Object obj) {
if(SIZE==element.length) {
int newNum=element.length+(element.length>>1); //1.5倍
Object[] newArray=new Object[newNum]; //创建新数组
System.out.println(newArray.length);
//使用arraycopy函数进行数组的拷贝
System.arraycopy(element, 0, newArray, 0, element.length);
element=newArray; //将新数组的引用赋值给老数组,老数组对象被垃圾回收机制清理掉
}
element[SIZE++]=obj;
}
//重写Object中的toString方法
@Override
public String toString() {
//定义一个StringBuilder来打印
StringBuilder out=new StringBuilder();
out.append('[');
for(int i=0;i<SIZE;i++) { //限定了SIZE,没有添加元素的位置的NULL不会打印出来
out.append(element[i]+","); //应使用" ",而不是' ' 即使用字符串类型
}
//for(Object obj:element) {
// out.append(obj); //打印出来是[[1998,8,25,null,null,null,null...null]
//}
out.setCharAt(out.length()-1, ']'); //把最后一个,替换成]
return out.toString();
/** out.toString返回的是:
* public String toString() {
return new String(value, 0, count);
}
*/
}
//get set 方法 以及 索引合法性判断(越界)
public Object get(int index) {
rangeValid(index);
Object re=element[index];
return re;
}
public void set(int index,Object newOne) {
rangeValid(index);
element[index]=newOne;
}
//索引合法性判断(越界)【封装】
public void rangeValid(int index) {
if(index<0||index>element.length-1) {
throw new RuntimeException(); //手动抛出异常
}
}
//删除 (这里用的自己编写的方法,也可以使用自带的arraycopy方法)
//SIZE:表示已添加的元素的个数
//element.length:表示数组的总容量
public void remove(int index) {
rangeValid(index);
for(int i=index;i<SIZE-1;i++) { //这里使用SIZE
set(i,get(i+1)); //前移
}
element[SIZE-1]=null; //删除前数组的最后一个元素 设置为null
SIZE--; //调试时发现SIZE没有更新,这里减1更新
}
public static void main(String[] args) {
List0 test0 =new List0(8); //初始化数组为8
//如果没有重写Object中的toString方法,打印出来的结果如下:
//System.out.println(test0); //Mylist.List0@15db9742
for(int i=0;i<20;i++) {
test0.add(i);
}
//打印结果,可以看出,自动扩容了
System.out.println(test0); //[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
System.out.println(test0.get(8)); //8
//System.out.println(test0.get(1000)); //Exception in thread "main" java.lang.RuntimeException
test0.set(0, 10); //将索引0的值改成10
System.out.println(test0.get(0)); //10
test0.remove(0);
System.out.println(test0); //[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
}
}