模拟(手写)ArrayList

1、自定义异常类

IllegalArgumentMyException类
package com.example.demo.collection;

/**
 * @Description 自定义非法参数异常
 * @Auther gf.x
 * @Date 2020/5/24 15:38
 */
public class IllegalArgumentMyException extends RuntimeException{

    public IllegalArgumentMyException() {
    }

    public IllegalArgumentMyException(String message) {
        super(message);
    }
}
IndexOutOfBoundsMyException类
package com.example.demo.collection;

/**
 * @Description 自定义数组索引越界异常
 * @Auther gf.x
 * @Date 2020/5/24 16:58
 */
public class IndexOutOfBoundsMyException extends RuntimeException{
    public IndexOutOfBoundsMyException() {
    }

    public IndexOutOfBoundsMyException(String message) {
        super(message);
    }
}

2、模拟ArrayList类实现

SimulateArrayList类
package com.example.demo.collection;

/**
 * @Description 模拟(手写)ArrayList
 * 步骤:
 * 1、定义常量
 * 2、定义成员变量
 * 3、定义构造方法
 * 4、定义操作(容器)成员变量的方法
 *
 * @Auther gf.x
 * @Date 2020/5/24 15:14
 */
public class SimulateArrayList<E> /*implements List, Serializable*/ {
    //不指定大小的默认空实例数组
    private static final Object[] DEFAULT_EMPTY_ELEMENTDATA = {};

    //容器数组默认初始化大小
    private static final int DEFAULT_CAPACITY = 10;

    //存放元素的数组容器
    private Object[] elementData;

    //数组容器中元素数量
    private int size;

    public SimulateArrayList() {
        this(DEFAULT_CAPACITY);
    }

    public SimulateArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentMyException("非法参数");
        }
        elementData = new Object[initialCapacity];
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean add(E e) {
        //扩容和复制
        ensureCapacityInternal();

        elementData[size++] = e; //size++先赋值后加加
        return true;
    }

    public void add(int index, E element) {
        rangeCheck(index);
        //扩容和复制
        ensureCapacityInternal();

        //指定索引位置添加元素,右边元素右移
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = element;
        size++;
    }

    public E get(int index) {
        rangeCheck(index);
        return elementData(index); //index < 0 时此处会抛越界异常
    }

    public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

    public E remove(int index) {
        rangeCheck(index);
        E oldValue = elementData(index);

        //删除索引位置元素,右边元素左移
        int numMoved = size - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[--size] = null;
        return oldValue;
    }

    public boolean remove(Object obj) {
        if (obj == null) {
            for (int i = 0; i < size; i++) {
                if (elementData[i] == null) {
                    fastRemove(i);
                    return true;
                }
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (obj.equals(elementData[i])) {
                    fastRemove(i);
                    return true;
                }
            }
        }
        return false;
    }

    //扩容和复制
    private void ensureCapacityInternal() {
        if (size >= elementData.length) {
            Object[] newArray = new Object[elementData.length << 1];
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }
    }

    private void fastRemove(int index) {
        //删除索引位置元素,右边元素左移
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index, numMoved);
        elementData[--size] = null;
    }

    @SuppressWarnings("unchecked")
    private E elementData(int index) {
        return (E) elementData[index];
    }

    private void rangeCheck(int index) {
        if (index >= size) { //数组索引本身就是大于0的,所以这里可以不加 index < 0
            throw new IndexOutOfBoundsMyException("索引越界");
        }
    }
}

3、测试类

package com.example.demo.collection;

import org.junit.Test;

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

/**
 * @Description ArrayList容器的使用
 * @Auther gf.x
 * @Date 2020/5/22 18:27
 */
public class TestList {

    @Test
    public void test() {
        List list = new ArrayList();

        list.add(111);
        list.add("abdc");
        list.add(new Date());
        System.out.println(list);
        list.remove(new Date()); //移除成功 hashCode equals
        System.out.println(list);
    }

    @Test
    public void test1() {
        SimulateArrayList list = new SimulateArrayList();
        list.add("aaaa");
        list.add("aaaa");
        list.add("aaaa");
        list.remove(1);
        //System.out.println(list.get(-5)); //索引小于0,抛索引越界异常
        System.out.println(list.get(2));

    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值