JavaArrayList简单实现

话不多说直接上代码

public interface List<E> extends Iterable<E>{
	//获取当前线性表的最大容量
	public int getCapacity();
	//获取线性表中有效元素的个数
	public int size();
	//判断线性表是否为空
	public boolean isEmpty();
	
	//在表尾添加元素
	public void add(E e) ;
	//在指定索引处添加元素
	public void add(int index,E e);
	
	//删除指定元素
	public void remove(E e);
	//删除指定索引的元素
	public void remove(int index);
	
	//修改指定索引的元素,返回该位置原来的元素
	public E set(int index,E e);
	
	//获取指定元素的索引
	public int indexOf(E e);
	
	//判断线性表是否包含指定元素
	public boolean contains(E e);
	//获取指定索引的元素
	public E get(int index);
	//清空线性表
	public void clear();
	//根据指定迭代器对线性表进行排序
	public void sort(Comparator<E> comparator);
	//获取子表
	public List<E> subList(int fromIndex,int endIndex);
	
}
public class ArrayList<E> implements List<E>{
	//首先我们必须有一个数组存放数据
	private E[] data;
	//存放有效元素的个数
	private int size;
	//默认的初始容量
	private static final int  DEFAULT_CAPACITY=10;
	public ArrayList(int size) {
		if(size<DEFAULT_CAPACITY) {
			throw new IllegalArgumentException("size can not < 10");
		}
		data=(E[])new Object[size];
		size=0;
	}
	public ArrayList() {
		this(DEFAULT_CAPACITY);
	}
	public ArrayList(E[] arr) {
		if(arr==null||arr.length==0) {
			throw new IllegalArgumentException("arr can not to be null");
		}
		data=(E[])new Object[DEFAULT_CAPACITY];
		for(int i=0;i<arr.length;i++) {
			add(arr[i]);
		}
	}

	@Override
	public int getCapacity() {
		return data.length;
	}

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

	@Override
	public boolean isEmpty() {
		return size==0;
	}
	//该方法其实等同于指定在表尾添加元素
	@Override
	public void add(E e) {
		add(size,e);
	}

	@Override
	public void add(int index, E e) {
		if(index<0||index>size) {
			throw new IndexOutOfBoundsException("index is illegal in  method  add");
		}
		if(size==data.length) {
			//每次以两倍扩容
			resize(size*2);
		}
		for(int i=size;i>index;i--) {
			data[i]=data[i-1];
		}
		data[index]=e;
		size++;
	}

	private void resize(int newLen) {
		E[] newData=(E[])new Object[newLen];
		for(int i=0;i<size;i++) {
			newData[i]=data[i];
		}
		data=newData;
	}
	@Override
	public void remove(E e) {
		remove(indexOf(e));
		
	}

	@Override
	public void remove(int index) {
		if(index<0||index>=size) {
			throw new IndexOutOfBoundsException("index is illegal in method remove");
		}
		for(int i=index;i<size-1;i++) {
			data[i]=data[i+1];
		}
		size--;
		if(size<data.length/4&&data.length>10) {
			resize(data.length/2);
		}
	}

	@Override
	public E set(int index, E e) {
		if(index<0||index>=size) {
			throw new IndexOutOfBoundsException("index is illegal in method set");
		}
		E old=data[index];
		data[index]=e;
		return old;
	}

	@Override
	public int indexOf(E e) {
		for(int i=0;i<size;i++) {
			if(data[i].equals(e)) {
				return i;
			}
		}
		return -1;
	}

	@Override
	public boolean contains(E e) {
		return indexOf(e)!=-1;
	}

	@Override
	public E get(int index) {
		if(index<0||index>=size) {
			throw new IndexOutOfBoundsException("index is illegal in method set");
		}
		return data[index];
	}

	@Override
	public void clear() {
		data=(E[]) new Object[DEFAULT_CAPACITY];
		size=0;
	}

	@Override
	public void sort(Comparator<E> comparator) {
		for(int i=0;i<size;i++) {
			E temp=data[i];
			int j;
			for(j=i;j>0&&comparator.compare(data[j-1], temp)>0;j--) {
				data[j]=data[j-1];
			}
			data[j]=temp;
		}
	}

	@Override
	public List<E> subList(int fromIndex, int endIndex) {
		if(fromIndex>endIndex) {
			throw new IllegalArgumentException("fromIndex can not upper to endIndex");
		}
		if(fromIndex<0) {
			throw new IllegalArgumentException("fromIndex can not <0");
		}
		if(endIndex>=size) {
			throw new IllegalArgumentException("endIndex can not >=size");
		}
		List<E> list=new ArrayList<>(DEFAULT_CAPACITY);
		for(int i=fromIndex;i<=endIndex;i++) {
			list.add(data[i]);
		}
		return list;
	}
	@Override
	public Iterator<E> iterator() {
		Iterator<E> itertor =new Iterator<E>() {
			private int index;
			@Override
			public boolean hasNext() {
				return index<size;
			}
			@Override
			public E next() {
				return data[index++];
			}
		};
		return itertor;
	}
	@Override
	public String toString() {
		StringBuilder str=new StringBuilder();
		str.append("[");
		if(size==0) {
			str.append("]");
		}else {
			for(int i=0;i<size;i++) {
				str.append(data[i]);
				if(i!=size-1) {
					str.append("、");
				}else {
					str.append("]");
				}
			}
		}
		str.append(size+"/"+data.length);
		return str.toString();
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值