ArrayList大家应经常用吧。今天我们来做一个仿照的MyList
实现起来也很简单
一、成员变量
我们要存数据,那么得有一个泛型数组,还要有List的长度,还有List的容量。
属性定义如下
//存放数据的数组 protected T[] data; //数组的长度 protected int length; //数组的容量 private int capacity;
二、接下来是各种操作列表的方法
首先看构造方法,如下,提供个两种构造方法,默认构造和无参构造
//默认构造 public MyList(){ this(10); } //带参构造 public MyList(int capacity){ if (capacity<=0) capacity = 10; length = 0; data = (T[]) new Object[capacity]; }
求列表长度方法很简单,就不多说了,直接返回属性变量length就行
//size方法 public int size(){ return length; }
接下来看添加方法,我实现了两种,一种是添加元素到末尾,另一种是在指定位置添加元素
添加时只需要注意一点,那就是扩容问题,当数组长度等于属性变量length时,说明数组已经满了,需要扩容
下面看实现
//add方法 public void add(T x){ if (length == data.length) grow(); data[length] = x; length++; }
//指定位置插入 public void add(int i,T x){ if (length == data.length) grow(); if (i<0) i=0; if (i>length) i = length; for (int j=length-1;j>=i;j--) data[j+1] = data[j]; data[i] = x; length++; }
get方法也很简单,只要注意传入的参数是否有效
//get方法 public T get(int index){ if (index<0 || index>length-1) throw new IndexOutOfBoundsException(); return data[index]; }
查找方法也很简单,遍历数组判断就行。注意null值和非null值
//查找元素 public int indexOf(T x){ if (x==null){ for (int i=0;i<length;i++){ if (data[i] == null) return i; } }else { for (int i = 0; i < length; i++) { if (data[i] == x) return i; } } return -1; }
接下来是移除元素方法,这里也是两个方法,一个是移除指定下标的元素,另外一个移除指定元素,下面看实现
//删除列表中的元素 public T remove(int i){ if (i<0 || i>=length) throw new IndexOutOfBoundsException(); T old = data[i]; for (int j=i;j<length;j++) data[j] = data[j+1]; data[--length] = null; return old; } //删除特定的元素 public T remove(T x) { int i = indexOf(x); return remove(i); }扩容方法,我实现的很简单,只是单纯的将原长度加5。
private void grow() { int newSize = data.length + 5; capacity = newSize; data = Arrays.copyOf(data,newSize); }
迭代器其实也挺简单的,当然,我只实现了hashNext和next方法。看实现吧
@Override public Iterator<T> iterator() { return null; } class MyIteator implements Iterator<T>{ private int index = 0; @Override public boolean hasNext() { return index != size(); } @Override public T next() { return get(index++); } }
是不是挺简单,实现简单的列表可以加深我们对ArrayList的理解,源代码附上。
import java.util.Arrays; import java.util.Iterator; public class MyList<T> implements Iterable<T> { //存放数据的数组 protected T[] data; //数组的长度 private int length; //数组的容量 private int capacity; //默认构造 public MyList(){ this(10); } //带参构造 public MyList(int capacity){ if (capacity<=0) capacity = 10; length = 0; data = (T[]) new Object[capacity]; } //size方法 public int size(){ return length; } //get方法 public T get(int index){ if (index<0 || index>length-1) throw new IndexOutOfBoundsException(); return data[index]; } //add方法 public void add(T x){ if (length == data.length) grow(); data[length] = x; length++; } //set方法 public boolean set(int i,T x){ if (i<0 || i>=length) return false; data[i] = x; return true; } //删除列表中的元素 public T remove(int i){ if (i<0 || i>=length) throw new IndexOutOfBoundsException(); T old = data[i]; for (int j=i;j<length;j++) data[j] = data[j+1]; data[--length] = null; return old; } //删除特定的元素 public T remove(T x) { int i = indexOf(x); return remove(i); } //查找元素 public int indexOf(T x){ if (x==null){ for (int i=0;i<length;i++){ if (data[i] == null) return i; } }else { for (int i = 0; i < length; i++) { if (data[i] == x) return i; } } return -1; } //指定位置插入 public void add(int i,T x){ if (length == data.length) grow(); if (i<0) i=0; if (i>length) i = length; for (int j=length-1;j>=i;j--) data[j+1] = data[j]; data[i] = x; length++; } //清除方法 public void clear(){ for (int i=0;i<length;i++) data[i] = null; length = 0; capacity = 0; } private void grow() { int newSize = data.length + 5; capacity = newSize; data = Arrays.copyOf(data,newSize); } @Override public Iterator<T> iterator() { return null; } class MyIteator implements Iterator<T>{ private int index = 0; @Override public boolean hasNext() { return index != size(); } @Override public T next() { return get(index++); } } }