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

本文深入剖析了Java中ArrayList泛型类的实现,包括基础数组、容量调整、增删查改操作以及Iterator接口的实现。示例代码展示了一个自定义的ArrayListDemo类,详细解释了其内部工作原理和关键方法。
摘要由CSDN通过智能技术生成

为了避免与类库中的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);

}

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值