5.4 ArrayList基础知识

底层实现

      ArrayList是接口List的一个子类实现。ArrayList底层是用数组实现的存储,其特点是查询效率高、增删效率低、线程不安全。
      数组长度是有限的,但ArrayList是可以存放任意数量的对象,长度不受限制。因为它采用了数组扩容的机制实现的,其实就是在对数组进行操作前,判断数组长度是否足够,不够就进行扩容。

内部方法

      由于ArrayList是接口List的一个子类实现,所以ArrayList实现了List的所有抽象方法。
具体请参考:List接口基础知识

自定义ArrayList

/**
 * 自定义实现一个ArrayList
 * @author dxt
 *
 */
public class MyArrayList<E> {
	private Object[] elements;
	private int size;	//	数组元素当前个数
	private static final int DEFALT_CAPACITY = 10;
	
	public MyArrayList(){
		super();
		elements = new Object[DEFALT_CAPACITY];
	}
	public MyArrayList(int capacity){
		if(capacity < 0){
			throw new RuntimeException("容量不合法:"+capacity);
		}else if(capacity < 0){
			elements = new Object[DEFALT_CAPACITY];
		}else{
			elements = new Object[capacity];
		}
	}
	/**
	 * 向数组内添加元素
	 * @param obj
	 */
	public void add(E obj){
		if(size == elements.length){
			//进行扩容
			Object[] newArray = new Object[elements.length + (elements.length>>1)];
			System.arraycopy(elements, 0, newArray, 0, size);
			elements = newArray;
		}
		elements[size++] = obj;
	}
	/**
	 * 获取索引index处的元素
	 * @param index
	 * @return
	 */
	public E get(int index){
		checkRange(index);
		return (E)elements[index];
	}
	/**
	 * 设置索引index处的元素为element
	 * @param element
	 * @param index
	 */
	public void set(E element, int index){
		//判断索引是否合法
		checkRange(index);
		elements[index] = element;
	}
	/**
	 * 移除索引index处的元素
	 * @param index
	 */
	public void remove(int index){
		System.arraycopy(elements, index+1, elements, index, elements.length-index-1);
		elements[--size] = null;
	}
	/**
	 * 移除与element相等的元素
	 * @param element
	 */
	public void remove(E element){
		for(int i=0; i<size; i++){
			if(element.equals(get(i))){
				//将该元素移除
				remove(i);
			}
		}
	}
	/**
	 * 返回容器元素个数
	 * @return
	 */
	public int size(){
		return size;
	}
	/**
	 * 判断容器是否为空
	 * @return
	 */
	public boolean isEmpty(){
		if(size == 0){
			return true;
		}
		return false;
	}
	/**
	 * 检查索引是否合法
	 * @param index
	 */
	public void checkRange(int index){
		if(index < 0 || index > size-1){
			throw new RuntimeException("索引不合法" + index);
		}
	}
	/**
	 * 重写toString()方法,方便打印容器内容
	 * @param args
	 */
	public String toString(){
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for(int i=0; i<size; i++){
			sb.append(elements[i] + ",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
	}
	
	public static void main(String[] args){
		MyArrayList<String> list = new MyArrayList<String>(10);
		for(int i=0; i<20; i++){
			list.add("aa"+i);
		}
		list.set("AA", 0);
		list.get(19);
		list.remove("AA");
		System.out.println(list);
		System.out.println(list.isEmpty());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值