数组集合ArrayList编写

 java种的ArrayList 底层就是使用数组进行存储,这里就为大家示范一下,其他细节读者可以自己再去填补!
读者可以自己添加泛型进行处理。
package ArrayListWZF;

import java.util.Arrays;

public class MyArrayList
{
    //集合初始化容量
    private static final int CAPACITY = 10;

    private static final Object[] EMPTY_ELEMENTDATA = {};
    // 初始化数组
    private Object[] elementData;

    //当前存放元素的实际大小
    private int size;

    //默认不指定容量  就初始化10大小的数组
    public MyArrayList()
    {
        this.elementData=new Object[CAPACITY];
    }

    //根据容量初始化 集合中的数组
    public MyArrayList(int capacity)
    {
        if(capacity>0)
        {
            this.elementData=new Object[capacity];
        }
        else if(capacity==0)
        {
            this.elementData=EMPTY_ELEMENTDATA;
        }
        else
        {
            throw new IllegalArgumentException("集合初始化大小不能小于0: "+
                    capacity);
        }
    }

    /**
     * 向集合中添加一个元素
     * @param o
     */
    public void add(Object o)
    {
        //确保 最小容量够用
        ensureCapacity(size+1);
        elementData[size++]=o;
    }

    // 意思就是增加一个元素后,是否超出了数组的本来的原长度? 如果超出了就开始扩容,否者就不扩容
    private void ensureCapacity(int minCapacity)
    {
        if(minCapacity>this.elementData.length)
        {
            //扩容数组长度
            grow(minCapacity);
        }
    }

    /**
     * 扩容
     * @param minCapacity
     */
    private void grow(int minCapacity)
    {
        int oldCapacity=this.elementData.length;
        //扩容1.5倍
        int newCapacity=oldCapacity+(oldCapacity>>1);
        //判断扩容后是否小于minCapacity  这个判断就是针对初始容量为1的集合准备的
        if(newCapacity<minCapacity)
        {
            newCapacity=minCapacity;
        }
        //进行数组扩容了
        elementData=Arrays.copyOf (elementData,newCapacity);
    }

    /**
     * 获取元素
     * @param index 下标
     * @return
     */
    public Object get(int index)
    {
        if(index>=0&&index<elementData.length)
        {
            return this.elementData[index];
        }
        throw new IndexOutOfBoundsException ("数组下标越界");
    }

    /**
     * 根据下标索引删除 指定的元素
     * @param index
     * @return
     */
    public Object removeByIndex(int index)
    {
        rangeCheck(index);

        Object o=this.elementData[index];
        //计算此元素后的 剩余元素的总个数
        int numMoved = size - index - 1;
        //代表不是最后一个元素
        if(numMoved>0)
        {
            System.arraycopy (elementData,index+1,elementData,index,numMoved);
        }
        //然后把最后面的一个置空
        elementData[--size]=null;
        return o;
    }

    public boolean removeByObj(Object o)
    {
        if(o==null)
        {
            for (int i = 0; i <size ; i++)
            {
                if(elementData[i]==null)
                {
                    removeByIndex (i);  //一般情况下删除第一个匹配的就退出循环
                    return true;
                }
            }
        }
        else
        {
            for (int i = 0; i <size ; i++)
            {
                if(o.equals (elementData[i]))
                {
                    removeByIndex (i);  //一般情况下删除第一个匹配的就退出循环
                    return true;
                }
            }
        }
        return false;
    }




    /**
     * 确保下标索引的范围
     * @param index
     */
    private void rangeCheck(int index)
    {
        if(index>=size||index<0)
        {
            throw new RuntimeException("此集合中没有此元素");
        }
    }


    @Override
    public String toString()
    {
        return "MyArrayList{" + "elementData=" + Arrays.toString (elementData) + '}';
    }
}

测试:

package ArrayListWZF;

public class ArrayListTest
{
    public static void main(String[] args)
    {
        /*ArrayList<String> arrayList = new ArrayList<> ();
        arrayList.add ("111");
        arrayList.add ("222");*/
        MyArrayList myArrayList = new MyArrayList ();
        myArrayList.add ("1");
        myArrayList.add ("2");
        myArrayList.add ("3");
        myArrayList.add ("4");
        myArrayList.add (null);
        myArrayList.add ("5");


        System.out.println ("===删除前===");
        System.out.println (myArrayList);
        System.out.println ("===删除后===");
       /* myArrayList.removeByIndex (1);
        myArrayList.removeByIndex (2);*/
       myArrayList.removeByObj ("1");
        System.out.println (myArrayList);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值