Java 手动实现SxtArrayList

本实例基于学习ArrayList的实现原理,实例代码毫无使用价值,供学习使用

具体详情参考如下代码:

package com.yanxun.MyArraylist;

public class SxtArrayList<E> {
    private Object[] elementData;
    private int size;
    public static final int DEFALT_CAPACITY = 10;
    public SxtArrayList() {
        elementData = new Object[DEFALT_CAPACITY];
    }
    //构造传参构造大小
    public SxtArrayList(int capacity) {
        if(capacity < 0)
            throw new RuntimeException("这个容器的容量不能为负数");
        else if(capacity == 0)
            elementData = new Object[DEFALT_CAPACITY];
        else
            elementData = new Object[capacity];
    }
    //想容器末尾添加元素
    public void add(E element) {
        //扩容操作
        if(size == elementData.length) {
            //申请一个新的大的数组
            Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
            //将原数组拷贝到新数组中,并将索引应用到新数组,好像java会自动回收0引用的对象,所以不用释放之前的申请的内存
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }
        elementData[size++] = element;
    }
    //获取对应的索引的值
    public E get(int index) {
        checkRange(index);
        return (E)elementData[index];
    }
    //修改对应位置的索引值
    public void set(E element, int index) {
        checkRange(index);
        elementData[index] = element;
    }

    //返回当前容器元素个数
    public int size() {
        return size;
    }
    //判断当前容器是否为空
    public boolean isEmpty() {
        return size == 0? true : false;
    }
    //检查数组下标是否合法,索引下标是否越界
    public void checkRange(int index) {
        if(index < 0 || index > size - 1) {
            //不合法
            throw new RuntimeException("索引值不合法" + index);//手动抛出异常
        }
    }
    //移除容器中对应的元素
    public void remove(E element) {
        //element,将它和所有元素比较,
        for(int i = 0; i < size; ++ i){
            if(element == elementData[i]) {
                //将该元素移除容器
                remove(i);
            }
        }
    }
    //移除容器中对应索引的元素
    public  void remove(int index) {
        int numMoved = elementData.length - index - 1;
        if(numMoved>0)
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        elementData[-- size] = null;
    }
    //将容器转化成字符串输出,在输出容器时自动调用
    public String toString() {
        StringBuilder sb = new StringBuilder();//申请一个动态字符串
        sb.append('[');
        for(int i = 0; i < size; ++ i){//将数组中的对象添加到里面
            sb.append(elementData[i] + ",");
        }
        sb.setCharAt(sb.length()-1,']');//修改最后一个逗号

        return sb.toString();//返回字符串
    }



    public static void main(String[] args) {
        SxtArrayList<String> s1 = new SxtArrayList(20);
        for(int i = 0; i < 40; ++ i) {
            s1.add("gao" + i);
        }
        System.out.println(s1.get(39));
        s1.set("dfs", 10);
        s1.remove(3);
        System.out.println(s1);

    }
}
原文地址:https://www.cnblogs.com/rstz/p/13776850.html