手写ArrayList入门
ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口。Collection是所有集合类的父类。ArrayList使用非常广泛,不论是数据库表查询,excel导入解析,还是网站数据爬取都需要使用到,了解ArrayList原理及使用方法显得非常重要。
那么ArrayList是怎么初始化的?
private int index=0; //表示当前有0个,或者要插入的元素地址
private T[] data = (T[]) new Object[10]; //T表示为泛型
这里我们进行初始化,初始大小为10,经过阅读源码private static final int DEFAULT_CAPACITY = 10;我们发现他的初始值为10,所以这里我们也设置为10。
然后我们来实现增加数据的方法,这个时候我们需要考虑到ArrayList的拓容机制,那么它又是怎么拓容的呢?
扩容规则为“数组当前足够的最小容量 + (数组当前足够的最小容量 / 2)”,即数组当前足够的最小容量 * 1.5,当然有最大值的限制。
故我们的增加数据的方法为:
/**
* 线程不安全
* 超出索引 怎么解决?拓容
* @param add
*/
public void add(T add) {
//Java内部的拓展机制!!!ArrayList就这样
if(index>=data.length) {
T[] datanew=(T[]) new Object[data.length*2]; //这里我们扩容2倍
for(int i=0;i<data.length;i++) {
datanew[i]=data[i];
}
data=datanew;
}
data[index]=add;
index++;
}
那么我们要怎么删除呢?这里我们需要考虑到它的初始值,当我们ArrayList的长度小于10时,我们就不能一直的去改变它的长度,我们要一直使用默认长度10
public void del(int index) {
if(index>=this.index) {
}else {
this.index--;
for(int i=index;i<this.index;i++) {
data[i]=data[i+1];
}
if((this.index+1)*4<=data.length) {
int newlength=data.length/2;
if(newlength<10) {
newlength=10;
}
T[] newdata=(T[]) new Object[newlength];
for(int i=0;i<this.index;i++) {
newdata[i]=data[i];
}
data=newdata;
}
}
System.out.println(data.length);
}
本次重写ArrayList,只是粗些,我们进行简单入门还是可以的。