列表
List接口继承了java.lang.Object.Collection接口,长度可变且有序,使用起来比数组方便。List接口有ArrayList和LinkedList两个实现类,可自己用数组来实现ArrayList。
实现思想:
定义一个接口,该接口有添加元素、获得元素、删除元素、修改元素、获得大小、遍历输出几个方法。
数组长度固定,但需要列表长度可变,故需在改变列表中元素个数的方法中改变数组的大小。
定义接口时无法确定将要装入列表的元素类型,这里就需要用到泛型。
泛型
java中所有的类都是Object类的子类,虽然通过向上转型和向下转型解决之前元素类型的问题,但是向下转型是不安全的,当类型使用错误时,错误的向下转型能通过编译,但是不能正常运行。
定义泛型类语法如下:
类名<T>
T代表一个类型的名称。
在使用时可改变的内容让其变为需要的类型。
接口:
public interface MyArraylist<E> {
//添加元素
public void add(E e);
//获得元素
public E get(int index);
//删除元素
public void remove(int index);
//修改元素
public void renew(int index,Object e);
//获得大小
public int getSize();
//遍历
public void traverse();
}
接口实现类:
public class ImList<E> implements MyArraylist<E>{
int size = 0;
Object[] ListData = new Object[size];
//添加元素
public void add(E e) {
//创建一个比原来长度大1的数组
Object[] newarray = new Object[size+1];
//将添加元素保存在数组的最后一个位置
newarray[size] = e;
//将原来的数组复制到新数组中
System.arraycopy(ListData, 0, newarray, 0, ListData.length);
//将新数组赋给原数组
ListData = newarray;
//列表长度加一
size++;
}
//获得元素
public E get(int index) {
return (E)ListData[index];
}
//删除元素
public void remove(int index) {
for(int i=index;i<ListData.length-2;i++) {
ListData[i] = ListData[i+1];
}
size--;
}
//修改元素
public void renew(int index,Object e) {
ListData[index] = e;
}
//获得大小
public int getSize(){
return this.size;
}
//遍历
public void traverse() {
for(int i=0;i<ListData.length;i++) {
System.out.println(ListData[i]);
}
}
}
这样的实现方式在数据量小的时候还没有什么弊端,当数据量大的时候每次添加一个新数据,都要把数组重新复制一边,效率就会大大降低,还有优化的方法,在之后的学习中补充。