自己实现一下ArrayList

本文介绍了一个自定义的Java ArrayList类的实现,详细展示了如何通过数组实现列表的基本操作,如添加、删除、查找等,并解释了数组扩容的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java数据结构中数组列表,ArrayList的相关实现。

package pac01;
/**
* 列表接口,定义一些列的操作
**/
public interface List<T>{

	//向列表的尾部添加指定的元素
	public boolean add(T t);

	//在列表的指定位置插入新的元素
	public void add(int index,T t);

	//将列表中的所有元素添加到此列表的末尾
	public boolean addAll(List<T> list);

	//从列表中移除所有的元素
	public void clear();

	//列表中是否包含指定元素
	public boolean contains(Object b);

	//比较指定的对象与此列表是否相等
	public boolean equals(Object c);

	//获取指定位置的元素
	public T get(int index);

	//返回此列表的hashCode
	public int hashCode();

	//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回-1
	public int indexOf(Object o);

	//返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
	public int lastIndexOf(Object o);

	//移除列表中指定位置的元素
	public void remove(int index);

	// 从此列表中移除第一次出现的指定元素(如果存在)
	public void remove(Object o);

	//用指定元素替换列表中指定位置的元素
	public void set(int index,T t);

	//返回列表中的元素数
	public int size();
	
	//如果是整数,那么对数据进行排序
}
package pac01;
/**
 * java中的向量类似与数组的顺序存储的数据结构,但是具有比数据更强大的功能,它是
 * 允许不同类型元素共存的变长数组,也就是说,java中的向量的容量是可变的,而且他
 * 还提供了许多的方法来操作处理这些数据。jdk中的向量的实现包括Vector和ArrayList
 * Vector是线程安全的,但是操作效率较低。相反,正是ArrayList实现的优点。实际中
 * ArrayList使用较多
 **/

public class ArrayList implements List{
	
	//定义它的默认长度为10
	private int DEFAULT_SIZE = 10;

	//定义每次数组扩容的大小为5
	private int EXPAND_SIZE = 5;

	//向量中的元素个数
	public static int size = 0 , length = 10;

	private Object [] array;


	//定义它的构造方法
	public ArrayList(){
		array = new Object[10];
	}

	//定义对数据的操作的方法

	/** 
	 * 将指定的元素添加到列表尾
	 * @return 
	 **/
	@Override 
	public boolean add(Object c){
		//需要判断添加后数组能否存放的下
		boolean flag = this.needExpand(size+1);
		if(!flag) {//不需要扩展
			array[size] = c;
			size ++;
		} else {
			Object[] temp = array;//存放
			array = new Object[DEFAULT_SIZE + EXPAND_SIZE];
			this.length = array.length;
			this.copy(array,temp);
			array[size] = c;
			size++;
		}
		
		return true;
	}
	
	/**
	 * 进行数组的复制
	 * @param array2 新的数组
	 * @param temp 旧的数组
	 */
	private void copy(Object[] array2, Object[] temp) {
		int i = 0;
		for(Object o : temp) {
			array2[i] = o;
		}
	}

	@Override
	public void add(int index, Object t) {
		boolean flag = this.needExpand(size+1);
		if(!flag) {
			for(int i=size ; i>index ; i--) {
				array[size+1] = array[i];
			}
			array[index] = t;
			size++;
		}else {
			Object[] temp = array;//存放
			array = new Object[DEFAULT_SIZE + EXPAND_SIZE];
			this.length = array.length;
			this.copy(array,temp);
			
			for(int i=size ; i>index ; i--) {
				array[size+1] = array[i];
			}
			array[index] = t;
			size++;
		}
		
	}

	
	@Override
	public boolean addAll(List list) {
		boolean b = this.needExpand(size+list.size());
		
		if(b == false){//不需要扩容
			for(int i=0,j=this.size-1;i<list.size();i++){
				array[j] = list.get(i);
				size++;
			}
		}else {
			Object [] temp = array;
			array = new Object[this.size+list.size()];
			this.length = size+list.size();
			this.copy(array, temp);
			for(int i=0,j=this.size-1;i<list.size();i++){
				array[j] = list.get(i);
				this.size++;
			}
		}
		return true;
	}

	
	@Override
	public void clear() {
		for(int i=0;i<size;i++) {
			array[i] = null;
		}
		
	}

	
	@Override
	public boolean contains(Object b) {
		int i = 0;
		while(b != array[i]){
			i++;
			if(i==this.size) {
				return false;
			}
		}
		return true;
	}

	@Override
	public Object get(int index) {
		// TODO Auto-generated method stub
		return array[index];
	}

	@Override
	public int indexOf(Object o) {
		int index = -1;
		for(int i=0;i<this.size;i++){
			if(o.equals(array[i])){
				index = i+1;
			}
			break;
		}
		return index;
	}

	@Override
	public int lastIndexOf(Object o) {
		int index = -1;
		for(int i=this.size;i<0;i--){
			if(o.equals(array[i])){
				index = i+1;
			}
			break;
		}
		return index;
	}

	@Override
	public void remove(int index) {
		for(int i=index-1;i<this.size;i++) {
			array[i] = array[i+1];
		}
	}

	@Override
	public void remove(Object o) {
		int c = this.indexOf(o);
		if(c > 0) {
			this.remove(c);
		}
		
	}

	@Override
	public void set(int index, Object t) {
		array[index] = t;
		
	}

	@Override
	public int size() {
		return size;
	}

	/**
	 * 添加后的尺寸与原来的尺寸进行比较
	 **/
	public boolean needExpand(int afterSize){
		if(afterSize < length) {
			return false;
		}
		return true;
	}
	
	@Override
	public String toString() {
		return (String) this.get(size);
	}

}

这就是自己实现的ArrayList,测试了几个方法是正常的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值