模拟ArrayList(顺序表)的底层实现

打印 上一主题 下一主题

主题 940|帖子 940|积分 2820

模拟ArrayLIst的底层实现

[code]package com.tedu.api04.list;import java.util.Objects;/** * @author LIGENSEN * Date: 2023/7/20 11:35 */public class ArrayListDemo {    public static void main(String[] args) {        ArrList list=new ArrList(1);        list.add("a");        list.add("b");        list.add("c");        list.add("f");        list.add("c");//        list.add(0,"d");//        list.clear();//        list.add(4,"e");//        list.add(2,"f");//        list.add(4,"e");        System.out.println(list.indexOf("d"));        System.out.println(list.contains("c"));        System.out.println(list.get(2));        System.out.println(list.isEmpty());        System.out.println(list.lastIndexOf("c"));        list.remove(3);        list.remove("a");        list.set(1,"cc");        System.out.println(list.subList(0, 1));        list.toArray();        System.out.println(list);    }}/** * 用数组来实现 ArrList * 集合里面可以用 Object[] 存任意的数据 * * @param  *///模拟:用数组来实现ArrayListclass ArrList{    //数组    private Object[] arr;    //数组元素个数    private int size;    //初始容量    private int initialCapacity;    public ArrList(){        arr=new Object[10];    }    //指定容量    public ArrList(int initialCapacity){        // 初始容量必须 > 0        if(initialCapacity < 0){            throw  new IllegalArgumentException("非法参数异常");        }        this.initialCapacity=initialCapacity;        arr=new Object[this.initialCapacity];    }    //添加元素    public void add(E e){        //判断是否需要扩容        if(size == arr.length)grow();        //向第size位置上添加元素        arr[size++]=e;    }    //在指定的位置插入指定的元素    public void add(int index,E e){        //判断下标是否越界        if(index < 0 || index > size)            throw new IndexOutOfBoundsException("Index:" + index +",Size" + size);        //判断是否需要扩容        if(size == arr.length) grow();        //移动元素        /*for (int i = size-1; i >= index ; i--) {            arr[i+1]=arr;        }*/        System.arraycopy(arr,index,arr,index+1,size-index);        arr[index]=e;        size++;    }    //清空集合    public void clear(){        //清空每一个元素对应的引用        for (int i = 0; i < size; i++) {            arr=null;        }        //重构数组        arr=new Object[initialCapacity];        //元素个数归零        size=0;    }    //获取指定元素第一次出现的下标    public int indexOf(E e){        //遍历集合        for (int i = 0; i < size; i++) {            /**             * 第一个 == 判断引用类型是够相等             * arr.equals(e) 只能引用类型调用,判断的是值相等(重写Object 中的 equals之后)             */            //if(arr == e || arr != null && arr.equals(e))            if(Objects.equals(arr,e))                return i;        }        //如果整个循环结束,都没有return,说明没找到        return -1;    }    //判断是否包含指定元素    public boolean contains(E e){        return indexOf(e) >= 0;    }    //判断越界    private void outBounds(int index){        if(index < 0 || index >= size)            throw new IndexOutOfBoundsException("Index:"+index+",Size"+size);    }    //获取指定位置上的元素    public E get(int index){        //判断越界        outBounds(index);        //获取指定的元素        return (E)arr[index];    }    //判断集合是否为空    public boolean isEmpty(){        return size= 0 ; i--) {            if (Objects.equals(arr,e))return i;        }        return  -1;    }    //删除指定下标上的元素    public void remove(int index){        //判断越界        outBounds(index);        //后边的元素覆盖前面的元素        /*for (int i = index+1; i < size; i++) {            arr[i-1]=arr;        }*/        System.arraycopy(arr,index+1,arr,index,size-(index+1));        size--;    }    //删除指定元素    public void remove(E e){        //获取第一次出现的位置        int index = indexOf(e);        //判断是否存在        if(index >= 0)remove(index);    }    //替换指定位置上的元素    public void set(int index,E e){        //越界        outBounds(index);        //替换        arr[index]=e;    }    //获取元素个数    public int size(){        return  size;    }    //截取子列表    public ArrList subList(int fromIndex,int toIndex){        //判断下标范围        if(fromIndex < 0 || toIndex > size || fromIndex > toIndex)            throw new IllegalArgumentException();        //截取字列表        ArrList sub=new ArrList();        for (int i = fromIndex; i < toIndex; i++) {            sub.add((E)arr);        }        return sub;    }    //转为数组    public Object[] toArray(){        //新建数组        Object[] newArray=new Object[size];        //赋值元素        System.arraycopy(arr,0,newArray,0,size);        return newArray;    }    //扩容    private void grow(){        //计算新数组的容量        int capacity=size;        if(size < 2)            capacity +=1;        else            capacity=size + (size >> 1);        //构建新的数组        Object[] arr=new Object[capacity];        //将原来数组中的元素赋值到新的数组中        System.arraycopy(this.arr,0,arr,0,size);        this.arr=arr;    }    //转为字符传    @Override    public String toString() {        //判断集合是否为空        if(size
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表