深度剖析Java数据结构之表(三)——ArrayList泛型类的实现

为了避免与类库中的ArrayList类重复,在这里,使用的类名为ArrayListDemo。在Java中,ArrayList泛型类是继承AbstractList泛型类的,并且实现了List<E>, RandomAccess, Cloneable, java.io.Serializable这些接口。我在这里主要说数据结构,ArrayListDemo并没有继承List<E>, 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<T> { 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<T> iterator() { return new ArraylistIterator(); } private class ArraylistIterator implements Iterator<T> { 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); } } }


 上面的代码是一堆垃圾,写的真的很垃圾,很容易出现内存泄漏!

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/04/2510097.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值