Java学习日记之ArrayList

手动实现ArrayList

Java中的ArrayList的原理和线性表实现相同,底层利用数组来存放数据。不过可以扩容,扩容的原理是创建一个新的数组,然后把旧数组copy给新数组。

package com.ct.arraylist;


import java.util.ArrayList;
import java.util.List;

public class MyDefineArrayList<E> {
    private  Object[] elementDate;
    private  int size;
    private static final int ELEMENT_CAPACITY=10;
	
	//测试功能
    public static void main(String[] args) {
        MyDefineArrayList<Integer> myDefeineArrayList = new MyDefineArrayList();
        for (int i=0;i<20;i++){
            if (i<10){
                myDefeineArrayList.add(i);
            }else {
                myDefeineArrayList.add(1);
            }
        }
        System.out.println(myDefeineArrayList.toString());
        myDefeineArrayList.remove(10);
        System.out.println(myDefeineArrayList.toString());
        Integer i=1;
        myDefeineArrayList.remove(i);
        System.out.println(myDefeineArrayList.toString());
    }

    public MyDefineArrayList(){
        size=0;
        elementDate = new Object[ELEMENT_CAPACITY];
    }

    /**
     *
     * @param capacity  创建的集合大小,如果输入小于0,抛出异常.如果等于0,创建默认大小集合大小为ELEMENT_CAPACITY=0
     */
    public MyDefineArrayList(int capacity){
        if (capacity<0){
            throw new RuntimeException("容器容量不应该为负数");
        }else if (capacity==0){
            elementDate = new Object[ELEMENT_CAPACITY];
        }else{
            elementDate = new Object[capacity];
        }
    }

    /**
     * 扩容
     * @param minCapacity   size+1,判断集合是否满了
     */
    public void  grow(int minCapacity){
        int oldCapacity =elementDate.length;
        int newCapacity =oldCapacity+(oldCapacity>>1);
        if (newCapacity-minCapacity<0){
            newCapacity=minCapacity;
        }
        Object[] newObject = new Object[newCapacity];
        System.arraycopy(elementDate,0,newObject,0,elementDate.length);
        elementDate = newObject;
    }

    /**
     * 添加元素
     * @param element
     */
    public void add(E element){
        if (size==elementDate.length){
            grow(size+1);
        }
        elementDate[size++]=element;
    }

    @Override
    public String toString() {
        StringBuilder sb =new StringBuilder();
        int flag=0;
        sb.append("[");
        for (Object it:elementDate
             ) {
            if (it!=null){
                sb.append(it+",");
            }
        }
        sb.setCharAt(sb.length()-1,']');
        return  "MyDefineArrayList{"+"elementDate="+sb.toString()+"}";
    }

    /**
     * 检查索引
     * @param index
     */
    public void checkRange(int index){
        if (index>=size||index<0) {
            throw new RuntimeException("索引不合法:" + index + "\t" + "请输入区间[0," + size + ")之间的数");
        }
    }

    /**
     * 获取指定索引元素
     * @param index 索引
     * @return 元素
     */
    public E get(int index){
        checkRange(index);
        return (E) elementDate[index];
    }

    /**
     * 设置指定下标元素
     * @param element 元素
     * @param index 索引
     */
    public void set(E element,int index){
        checkRange(index);
        elementDate[index]=element;
    }

    /**
     * 删除集合指定索引的元素
     * @param index 指定索引
     * @return 删除的元素
     */
    public E remove(int index){
        checkRange(index);
        int moveNum = size-index-1;
        E element = (E) elementDate[index];
        if (moveNum>0)
            System.arraycopy(elementDate,index+1,elementDate,index,moveNum);
        elementDate[--size]=null;
        return element;
    }

    /**
     * 删除集合中的指定元素
     * @param elemnet  指定元素
     * @return  删除元素的索引
     */
    public List remove(E elemnet){
        List<Integer> list = new ArrayList<>();
        int oldsize =size;
        int i=0,cot=0;
        while(elementDate[i]!=null){
            if (elementDate[i].equals(elemnet)){
                list.add(cot);
                remove(i);
                i--;
            }
            i++;
            cot++;
        }
        return list;
    }
	//获取容器长度
    public int size(){
        return size;
    }
    //获取容器是否为空
    public boolean isEmpty(){
        return size>0?true:false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值