模拟ArrayList类的实现
程序员文章站
2022-03-02 14:16:13
...
此例展示了ArrayList的存储实现,刚学集合类框架,希望对初学者有所借鉴,帮助理解ArrayList的用法等。此例不免有些许错误,还望各位高手指出。
[b]专注成就未来![/b]
package com.xiaodpro.util;
/**
* 模拟ArrayList类的实现
* @author xiaodpro
* 2010年3月7日
* @param <E>
*/
public class ArrayList<E>{
private Object[] elementData;
private int increment;
/**
* 创建一个默认大小及默认增长量的ArrayList
*/
public ArrayList() {
// 创建一个默认大小的ArrayList
this(10);
}
/**
* 创建一个指定初始大小的ArrayList
*
* @param initSize
* 初始大小
*/
public ArrayList(int initSize) {
this(initSize, 10);
}
/**
* 创建一个指定初始大小及增长量的ArrayList
*
* @param initSize
* 初始大小
* @param increment
* 增长量
*/
public ArrayList(int initSize, int increment) {
if(initSize < 10 || increment < 5)
throw new IllegalArgumentException();
this.elementData = new Object[initSize];
this.increment = increment;
}
/**
* 添加一个元素
* @param item 待添加的元素
*/
public void add(E item) {
// TODO Auto-generated method stub
add(item,size());
}
/**
* 向指定索引处添加一项
*
* @param item
* 待添加的元素
* @param index
* 指定索引
*/
public void add(E item, int index) {
if(index < 0 || index > size())
throw new ArrayIndexOutOfBoundsException();
while (isFull() || index > elementData.length) {
// 如果当前数据已满,则根据指定的增量增加一个单位值
Object[] tmp_ = new Object[elementData.length + increment];
// 将原来的数据复制到临时数组中
System.arraycopy(elementData, 0, tmp_, 0, elementData.length);
this.elementData = tmp_;
}
System.arraycopy(elementData, index, elementData, index+1, size()-index);
elementData[index] = item;
}
/**
* 移除指定的元素
*
* @param item
* 待移除的元素
* @return 移除的元素
*/
public E remove(Object item) {
// TODO Auto-generated method stub
if (isEmpty())
throw new NullPointerException();
try {
elementData[search(item)] = null;
} catch (ArrayIndexOutOfBoundsException e) {
throw new NullPointerException();
}
return remove(search(item));
}
/**
* 移除指定索引处的元素
*
* @param index
* 移除元素的索引
* @return 移除的元素
*/
public E remove(int index) {
if (isEmpty())
throw new NullPointerException();
E item = search(index);
System.arraycopy(elementData, index + 1, elementData, index, size() - index);
return item;
}
/**
* 移除ArrayList尾部元素
*
* @return 移除的元素
*/
public E remove() {
return remove(size() - 1);
}
/**
* 查找指定元素的索引
*
* @param item
* 指定的元素
* @return 指定元素的索引
*/
public int search(Object item) {
// TODO Auto-generated method stub
if (isEmpty())
return -1;
for (int i = 0; i < elementData.length; i++) {
// 遍历数组
if (elementData[i].equals(item))
return i;
}
return -1;
}
/**
* 查找指定索引处的元素
*
* @param index
* 指定的索引
* @return 指定索引处的元素
*/
@SuppressWarnings("unchecked")
public E search(int index) {
if(index < 0 || index > size())
throw new ArrayIndexOutOfBoundsException();
return (E) elementData[index];
}
/**
* 判断ArrayList是否为空
*
* @return 如果为空返回true,否则返回false
*/
public boolean isEmpty() {
if(this.size() == 0)
return true;
return false;
}
/**
* 将ArrayList转换为数组
*
* @return 转换后的数组
*/
@SuppressWarnings("unchecked")
public E[] toArray() {
Object temp = new Object[size()];
System.arraycopy(elementData, 0, temp, 0, size());
return (E[]) temp;
}
/**
* 获取ArrayList的元素个数
*
* @return 元素的有效个数
*/
public int size() {
for (int i = elementData.length - 1; i >= 0; i--) {
if (elementData[i] != null)
return i + 1;
}
return 0;
}
private boolean isFull() {
// 判断ArrayList是否已满;如果true,则返回true;否则返回false
if(this.size() < elementData.length)
return false;
return true;
}
public void clear() {
// TODO Auto-generated method stub
while(!isEmpty())
this.elementData[size()-1] = null;
}
}
[b]专注成就未来![/b]
上一篇: iframe页面内无框架无滚动条代码