为了避免与类库中的ArrayList类重复,在这里,使用的类名为ArrayListDemo。在Java中,ArrayList泛型类是继承AbstractList泛型类的,并且实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。我在这里主要说数据结构,ArrayListDemo并没有继承List, RandomAccess, Cloneable, java.io.Serializable这些结构,是一个独立的类,但是它需要实现Iterable泛型类的接口。
ArrayListDemo泛型类实现的细节如下:
1.ArrayListDemo将保持基础数组,数组的容量(最大长度),以及存储在MyArrayList中的当前项数的数量(实际长度);
2.ArrayListDemo将提供一种机制,一改变基础数组的容量。通过获得一个新数组,将老数组拷贝到新数组中来,允许虚拟机回收老数组,以达到改变基础数组容量的目的;
3.ArrayListDemo将提供Get和Set方法;
4.ArrayListDemo提供表的相应的操作。如添加,删除,清空,获得长度等等。
5.ArrayListDemo实现Iterator接口,用以实现遍历。
具体代码如下:
package ljp.Arraylist;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.lang.IndexOutOfBoundsException;
public class ArrayListDemo {
private final static int DEFULT_CAPACITY = 8;
private T[] arraylist;
private int size;// 最大存储量
private int length;// 数组中存放元素的个数
// 构造函数
public ArrayListDemo() {
clear();
}
// 返回数组的长度
public int Length() {
return this.length;
}
// 判断是否为空
public boolean isEmpty() {
return this.length == 0;
}
// 清空数组
public void clear() {
this.length = 0;
ensureCapacity(DEFULT_CAPACITY);
}
// 获得位置idx处的元素
public T get(int idx) {
if (idx < 0 || idx >= this.length) {
throw new ArrayIndexOutOfBoundsException("插入位置越界");
}
return arraylist[idx];
}
// 修改位置idx出的元素
public void set(int idx, T x) {
if (idx < 0 || idx >= this.length) {
throw new ArrayIndexOutOfBoundsException("插入位置越界");
}
arraylist[idx] = x;
}
// 将元素x添加到末尾
public void add(T x) {
add(this.length, x);
}
// 将元素x添加到指定位置idx
public void add(int idx, T x) {
if (idx < 0 || idx > this.length) {
throw new ArrayIndexOutOfBoundsException("插入位置越界");
}
if (this.size == this.length) {
ensureCapacity(2 * this.size);
}
for (int i = this.length; i > idx; i--) {
arraylist[i] = arraylist[i - 1];
}
arraylist[idx] = x;
++this.length;
}
// 移除指定位置的元素
public T remove(int idx) {
if (idx < 0 || idx >= this.length) {
throw new ArrayIndexOutOfBoundsException("删除位置越界");
}
T temp = arraylist[idx];
for (int i = idx; i < this.length; i++) {
arraylist[i] = arraylist[i + 1];
}
--this.length;
// Java中的ArrayList类最大长度只会增加,不会减小
if (this.length * 2 < this.size) {
ensureCapacity(this.size / 2);
}
return temp;
}
// 改变ArrayListDemo的最大存储量
private void ensureCapacity(int newCapacity) {
// 不允许新分配的数组长度小于当前数组的长度
if (newCapacity < this.length) {
return;
}
T[] oldlist = arraylist;
// Cannot create a generic array of T
// arraylist = new T[newCapacity];
arraylist = (T[]) new Object[newCapacity];
for (int i = 0; i < this.length; i++) {
arraylist[i] = oldlist[i];
}
this.size = newCapacity;
}
// 实现iterator()方法
public Iterator iterator() {
return new ArraylistIterator();
}
private class ArraylistIterator implements Iterator {
private int current = 0;
@Override
public boolean hasNext() {
return current < Length();
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return arraylist[current++];
}
@Override
public void remove() {
ArrayListDemo.this.remove(--current);
}
}
}
上面的代码是一堆垃圾,写的真的很垃圾,很容易出现内存泄漏!