自定义实现Java中的ArrayList集合

最近准备找工作,就复习了下Java的基础,顺便多看看源码,在复习到集合这一章时,就想着自己动手实现集合,就看了看jdk的源码,由于笔者本科学的是高分子材料,和计算机、软件、互联网完全不沾边,也没学过数据结构,但为了多了解这方便的知识,就根据jdk的源码,模仿了集合的实现,今天给大家带来的是ArrayList的实现,当然在这里笔者也只是实现了集合中部分常用的方法,并且也没有使用泛型。

首先笔者也是自己定义了一个MyList(对应jdk里面的List)接口(笔者没有像jdk里面去定义Collection接口),然后定义了一个MyList的实现类--MyArrayList。

具体代码如下,代码中有相关的注释,读者根据注释去学习:

package com.tiantang.collection;

/**
 * 自定义的List接口
 * @author LiuJinkun
 *
 */
public interface MyList {
	
	/**
	 * 增加元素
	 * @param obj
	 */
	void add(Object obj);
	
	/**
	 * 在指定索引处增加元素
	 * @param index
	 * @param obj
	 */
	void add(int index,Object obj);
	
	/**
	 * 根据对象删除元素
	 * @param obj
	 */
	void remove(Object obj);
	
	/**
	 * 根据索引删除元素
	 * @param index
	 */
	void remove(int index);
	
	/**
	 * 返回指定索引处的元素
	 * @param index
	 * @return
	 */
	Object get(int index);
	
	/**
	 * 修改指定索引处的元素
	 * @param index
	 * @param obj
	 */
	void set(int index,Object obj);
	
	/**
	 * 返回元素所在的索引
	 * @param obj
	 * @return
	 */
	int indexOf(Object obj);
	
	/**
	 * 判断集合是否为空
	 * @return
	 */
	boolean isEmpty();
	
	/**
	 * 清空集合
	 */
	void clear();
	
	int size();

}


package com.tiantang.collection;

/**
 * 自定义实现ArrayList
 * @author LiuJinkun
 *
 */
public class MyArrayList implements MyList{
	//ArrayList集合的底层实现是数组,因此定义了一个数组,用来存放元素
	private Object[] elementData;
	
	//数组的大小
	private  int size;
	
	public int size(){
		return size;
	}
	
	/**
	 * 无参构造器,默认初始化数组的大小为10
	 */
	public MyArrayList(){
		this(10);
	}
	
	/**
	 * 有参构造器,根据传入的数字来初始化数组的大小
	 * @param initialCapacity
	 */
	public MyArrayList(int initialCapacity){
		if(initialCapacity>0){
			elementData=new Object[initialCapacity];
		}else{
			throw new IllegalArgumentException();
		}
	}

	@Override
	public void add(Object obj) {
		//先判断数组容量是否足够
		ensureCapacity();
		elementData[size++]=obj;
	}

	private void ensureCapacity() {
		if(size==elementData.length){
			//扩容
			Object[] newArray=new Object[size*2+1];
			//然后将原数组的数据拷贝到新数组
			System.arraycopy(elementData, 0, newArray, 0, elementData.length);
			//最后让原数组的引用指向新数组对象
			elementData=newArray;
		}
	}

	@Override
	public void add(int index, Object obj) {
		//先判断索引是否越界
		rangCheck(index);
		ensureCapacity();
		//再进行数组的拷贝(为索引为index的位置腾出空位)
		System.arraycopy(elementData, index, elementData, index+1, size-index);
		//最后添加元素
		elementData[index]=obj;
		size++;
	}

	private void rangCheck(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException();
		}
	}

	@Override
	public void remove(Object obj) {
		for(int i=0;i<size;i++){
			if(elementData[i].equals(obj)){
				remove(i);
			}
		}
	}

	@Override
	public void remove(int index) {
		rangCheck(index);
		System.arraycopy(elementData, index+1, elementData, index, size-index-1);
		elementData[size--]=null;
	}

	@Override
	public Object get(int index) {
		//判断索引是否合法
		if(index>=size){
			throw new IllegalArgumentException();
		}
		return elementData[index];
	}

	@Override
	public void set(int index, Object obj) {
		rangCheck(index);
		elementData[index]=obj;
	}

	/**
	 * 返回元素第一次出现在集合中的索引,若集合中不包含该元素就返回-1
	 */
	@Override
	public int indexOf(Object obj) {
		for(int i=0;i<size;i++){
			if(elementData[i].equals(obj)){
				return i;
			}
		}
		//不包含该元素就返回-1
		return -1;
	}

	@Override
	public boolean isEmpty() {
		return size==0?true:false;
	}

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

}
上面的代码,经过笔者测试,不存在BUG,当然安全性肯定没有JDK的好,代码的优化也没有JDK做得好,笔者写这些代码,纯属只是为了练习,加深印象。后续笔者还会陆续实现其他的集合。



  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值