怎么手写一个简单的List集合

List集合

手写一个简单的List集合为自己调用并不是特别难,只需要定义一个集合接口去提供所有方法的定义
	如下代码 : 
package com.myself.util;
/**
 * 	
 * @author HappyBoy
 *
 */
public interface List {
	
	/**
	 * 	集合长度方法
	 * @return Integer
	 * 	返回集合长度
	 */
	Integer size();
	
	
	/**
	 * 	将集合转换为数组
	 * @return Object[]
	 * 	返回转换后的数组
	 */
	Object[] toArray();
	
	/**
	 * 	集合中是否包含指定元素
	 * @param element
	 * 	指定元素
	 * @return boolean
	 * 	返回是否包含的结果
	 * -true  包含
	 * -false 不包含
	 */
	boolean contains(Object element);
	
	/**
	 * 	根据指定元素进行删除
	 * @param element
	 * @return boolean
	 * 	-true 删除成功
	 *  -false 删除失败
	 */
	boolean remove(Object element);
	
	/**
	 * 	清空集合中所有元素
	 * 	@return boolean
	 * 	-true 删除成功
	 * 	-false 删除失败
	 */
	boolean removeAll();
	
	/**
	 * 	获取元素根据指定下标
	 * @param index
	 * 	下标
	 * @return
	 * 	返回元素
	 */
	Object get(int index);
	
	/**
	 * 	判断集合是否位空
	 * @return
	 * -true 集合为空
	 * -false 集合不为空
	 */
	boolean isEmpty();
	
	/**
	 * 	为集合添加元素
	 * @param e
	 * 	添加元素
	 */
	void add(Object e);
}

我们只需要去将自己需要的方法定义添加到接口中,由我们去提供实现类去实现该接口
从而可以使用一个简单的集合。
比如我们可以写一个可以存储key,value的集合,可以在他的add方法让key值与主键值相似,传入null值便可以自增。

现在看一下实现类该如何写
public class MyList implements List,Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 	定义一个Object类型,我们实现的集合都是基于该数组
	 */
	private Object[] obj = new Object[1];

	/**
	 * 	定义一个存储下标值得变量
	 */
	private int index = -1;
	@Override
	public Integer size() {
		/*
		 * 	这个方法很好写,我们只需要将定义的obj数组的length属性返回即可
		 */
		return obj.length;
	}
	
	/**
	 * 	定义该类实例 每次调用构造方法为实例赋值
	 */
	private MyList myList ;

	@Override
	public Object[] toArray() {
		/*
		 * 	这个方法同样,将Object数组返回即可
		 */
		return obj;
	}

	@Override
	public boolean contains(Object element) {
		/*
		 *	是否包含?
		 *	通过遍历数组,我们根据元素进行比对,首先我们需要重写符合我们逻辑的equals和hashcode方法 
		 */
		boolean ifAppear = false;
		for (int i = 0; i < obj.length; i++) {
			ifAppear = (""+obj[i]).equals(element+"");
		}
		return ifAppear==false?false:true;
	}

	@Override
	public boolean remove(Object element) {
		/**
		 * 	根据指定元素进行删除
		 * 	首先我们需要根据元素进行比对
		 * 	设置一个下标值
		 * 	如果比对成功下标值记录需要删除的下标值
		 * 	通过数组的删除来进行实现这个功能
		 */
		int index=0;
		for (int i = 0; i < obj.length; i++) {
			index = (element+"").equals((obj[i]+"")) == true?i:-1;
			if(index>-1) break; //如果index>-1就说明找到了 直接跳出循环即可
		}
		if(index!=-1) {
			Object flag = null; //设置一个接收变量 用于交换
			for (int i = index; i < obj.length-1; i++) { //执行交换 就不说了 原理与冒泡排序类似
				flag = obj[i];
				obj[i]=obj[i+1];
				obj[i+1]=flag;
			}
			obj = Arrays.copyOf(obj, obj.length-1); //当执行完for循环之后就代表交换完毕,可以执行缩容
			return true;
		}
		return false;
	}

	@Override
	public boolean removeAll() {
		for (int i = 0; i < obj.length; i++) obj[i] = null;
			
		return obj.length==0?true:false;
	}

	@Override
	public Object get(int index) {
		return index>obj.length-1?null:obj[index];
	}

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

	@Override
	public void add(Object e) {
		index +=1; //调用一次数组长度+1 
		if(index>obj.length-1)obj = Arrays.copyOf(obj, obj.length+1);//动态扩容 如果调用次数使index大于数组下标(因为index是下标)扩容一位
		obj[index] = e;
	}

	public MyList() {
		myList = this;
	}
}
	
只写一个为自己服务的集合并不难,通过对数组的增,删,改,查便可以写一个非常简单的集合
	通过如上代码以及注释自行理解。

你可能感兴趣的:(Java)