【自定义ArrayList链表】

import java.util.Arrays;

/**自定义ArrayList
 * 泛型用于约束集合中所存储的元素类型
 * */
public class MyArrayList<E> {
	/**集合内部用于存储元素的数组*/
	private Object[] elementData;
	/**统计有效元素个数*/
	private int size;
	/**默认数组*/
	private static final Object[] EMPTY_ELEMENTDATA = {};
	/**默认容量*/
	private static final int DEFAULT_CAPACITY = 10;

	/**无参构造*/
	public MyArrayList(){
		this.elementData = EMPTY_ELEMENTDATA;
	}

	/**带初始容量的构造器*/
	public MyArrayList(int initialCapcity) {
		if(initialCapcity<0) {
			throw new IllegalArgumentException("容量大小错误");
		}
		this.elementData = new Object[initialCapcity];
	}
	
	/**
	 * 向集合末尾添加一个元素
	 */
	public void add(E e) {
		//考虑需不需要扩容
		ensureCapacityInternal();
		//往数组中存储元素,同时计数加1
		elementData[size++] = e;
	}
	
	/**获取集合中有效元素的个数*/
	public int size() {
		return size;
	}
	
	/**获取存储元素的内部数组*/
	public Object[] elementData() {
		return elementData;
	}
	
	/**判断集合是否为空*/
	public boolean isEmpty() {
		return size==0;
	}
	
	/**清空集合中元素*/
	public void clear() {
		for(int i=0;i<size;i++) {
			elementData[i] = null;
		}
		size = 0;
	}
	
	/**向集合中指定下标位置插入元素
	 * [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
	 * index=3
	 * [aaa, bbb, ccc, mmm, aaa, bbb,ccc , null, null, null]
	 * 
	 * */
	public void add(int index,E e) {
		//判断下标
		if(index<0 || index>size) {
			throw new IndexOutOfBoundsException("插入元素下标越界");
		}
		//考虑是否需要扩容
		ensureCapacityInternal();
		System.arraycopy(elementData, index, 
						elementData, index+1, size-index);
		//替换指定下标位置元素
		elementData[index] = e;
		size++;
	}
	
	/**
	 * 根据下标删除指定位置元素,
	 * 返回被删除的元素
	 * 
	 * [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
	 * size=6
	 * index=2
	 * [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
	 *            aaa, bbb,ccc
	 */
	public E remove(int index) {
		//判断下标
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException("删除元素下标越界");
		}
		//获取需要被删除的元素
		E oldValue = (E)elementData[index];
		System.arraycopy(
				elementData, index+1, 
				elementData, index, size-index-1);
		size--;
		return oldValue;
	}
	
	/**
	 * 获取指定元素的下标
	 * [aaa, null, ccc, aaa, bbb,ccc , null, null, null, null]
	 * size=6
	 */
	public int indexOf(E e) {
		if(e==null) {
			for(int i=0;i<size;i++) {
				if(get(i)==null) {
					return i;
				}
			}
		}else {
			for(int i=0;i<size;i++) {
				if(e.equals(get(i))) {
					return i;
				}
			}
		}
		return -1;
	}
	
	/**根据元素内容移除集合中元素*/
	public boolean remove(E e) {
		//根据元素内容获取他的下标
		int index = indexOf(e);
		//没有找到该元素内容
		if(index<0)return false;
		//根据下标去删除元素
		remove(index);
		return true;
	}
	
	/**获取指定下标位置的元素*/
	public E get(int index) {
		//判断下标
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException("获取元素下标越界");
		}
		return (E)elementData[index];
	}
	
	/**
	 * 扩容的方法
	 * 1>第一次添加元素时,将数组长度改为10
	 * 2>后续数组中元素内容满了,扩容之前长度1.5倍
	 */
	private void ensureCapacityInternal() {
		if(elementData.length==0) {//第1次添加元素
			this.elementData = new Object[DEFAULT_CAPACITY];
		}else if(elementData.length==size) {//数组满了
			this.elementData = Arrays.copyOf(
				elementData,elementData.length+(elementData.length>>1));
		}
	}
	/**
	 * [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
	 * size=6
	 * 
	 * [aaa, bbb, ccc, aaa, bbb,ccc]
	 */
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
		for(int index=0;index<size;index++) {
			Object obj = elementData[index];
			sb.append(obj+",");
		}
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	
	
	public static void main(String[] args) {
		//创建集合对象
		MyArrayList<String> list = new MyArrayList<String>();
//		System.out.println(list.size);
//		System.out.println(Arrays.toString(list.elementData()));
		
		list.add("aaa");
		list.add(null);
		list.add("ccc");
		list.add("bbb");
		list.add("ccc");
		list.add(null);
		
		//[aaa,bbb,ccc,null]
		System.out.println(list);
		list.remove(null);
		list.remove("ccc");
		System.out.println(list);
		
//		System.out.println(list.indexOf(null));//1
//		System.out.println(list.indexOf("ccc"));//2
		
//		list.add(3,"mmm");
//		list.add(7,"nnn");
//		System.out.println(list);
//		
//		//[aaa,bbb,ccc,mmm,aaa,bbb,ccc,nnn]
//		String e = list.remove(2);
//		System.out.println("e:"+e);
//		System.out.println(list);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

God Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值