public class TestArrayList{
public static void main(String[] args){
//测试模拟实现是否成功
TestList list = new TestList();//data:10
list.add(77);
list.add(55);
list.add("testtest");
System.out.println(list.size());
System.out.println(list.get(0));
list.remove(new Integer(77));
System.out.println(list.size());
}
}
//自己写一个类模拟实现ArrayList
class TestList{
//属性:对象有什么
private Object[] data;//装元素的容器
//专门用来装元素个数的
private int size; //add() size++ remove() size--
//构造方法:
//有参构造:参数表示数组空间大小
//TestList(-34);->data:34
public TestList(int x){ //x : 空间大小
if(x < 0){
System.out.println("参数错误");
}else{//x >= 0
data = new Object[x];
}
}
public TestList(){
//默认开辟10块空间
//data = new Object[10];
this(10);
}
//方法:
//得到集合里面的元素个数
//int -> list.size();
public int size(){
return size;
}
//得到集合里面某一个元素:
//Object obj = list.get(3)
public Object get(int x){//x -> 下标
//当我们往集合里面添加元素的时候 所有的元素
//最终都要添加进data数组里面
//当我们问集合要下标x的时候 只能讲数组的下标x
//返回
return data[x];
}
//如何添加元素:
//void -> list.add(元素);
public void add(Object obj){
//当我们想要王集合俩面添加元素的时候
//最终都要把元素添加进data数组里面
//当我们往数组里面添加元素的时候 需要判断当前数组对象满了吗?
if(data.length == size){
//如果满了
//扩容
//创建一个更大的数组对象
//jdk6.0 x * 3 / 2 + 1
//jdk7.0 x + (x >> 1)
Object[] temp = new Object[size * 3 / 2 + 1];
//将老数组里面的元素复制到新数组里面
System.arraycopy(data,0,temp,0,size);
//改变引用指向
data = temp;//参数传递
//回收老数组对象 -》 gc
//继续添加元素
data[size] = obj;
//size+1
size++;
}else{
//如果没满
//直接添加元素obj
data[size] = obj;
//size+1
size++;
}
/**
已有元素个数 最大下标 新来下标
1 0 1
2 1 2
3 2 3
size size-1 size
*/
}
//如何删除元素:
//void -> list.remove(3)
public void remove(int x){//x -> 下标
//当我们想要从集合里面删除下标x的时候
//其实就是从数组里面删除下标x
//data -> 删除 -》 数组复制
System.arraycopy(data,x+1,data,x,size-x-1);
size--;
/**
34 77 82 90
[0] [1] [2] [3]
删除下标0 从下标1开始复制 复制3=4-1个元素
删除下标1 从下标2开始复制 复制2=4-2个元素
删除下标2 从下标3开始复制 复制1=4-3个元素
删除下标x 从下标x+1开始复制 复制size-(x+1)
*/
}
//如何删除元素:
//void -> list.remove(元素);
public void remove(Object obj){
//当我们要删除元素obj的时候 底层拿着obj
//和集合里面的每一个元素做equals比较
for(int x = 0;x < size;x++){
//x -> 下标 元素:data[x]
if(obj.equals(data[x])){
//下标x对应的元素和obj视为相等独享
//那么就要删除下标x对应的元素
remove(x);
break;
}
}
}
}