zoukankan      html  css  js  c++  java
  • 如何手写一个ArrayList

    写完HashMap,觉得手痒痒,所以隔了一天再来实现一下简单的ArrayList,ArrayList相比而言就非常的简单,主要的核心点有以下几个方面:

    1.ArrayList的底层是由数组构成的

    2.添加时需要考虑扩容问题

    3.对于index索引的操作,需要考虑到下标不合法的异常

    4.remove操作的时候,需要一点数学知识进行一下逻辑操作

    下面贴出我的代码:

    MyList接口:

    public interface MyList {
    
        // 求容量
        int size();
    
        // 是否为空
        boolean isEmpty();
    
        // 判断是否存在
        boolean contains(Object o);
    
        // 清空集合
        void clear();
    
        // 返回添加是否成功
        boolean add(Object object);
    
        // 返回删除是否成功
        boolean remove(int index);
    
        // 获取索引位置的值
        Object get(int index);
    
    }

    MyArrayList 实现类的代码:

    /***
     * author kxm
     * email 806857264@qq.com
     * date 2018/9/17
     */
    public class MyArrayList implements MyList {
    
        private int size;
        private Object[] elementData;
        // JDK源码规定长度
        private static final int DEFAULT_CAPACITY = 10;
    
        // 构造方法 --- 空参
        public MyArrayList(){
            this(DEFAULT_CAPACITY);
        }
        // 有参构造方法
        public MyArrayList(int initialCapacity){
            /*
             * 1.含参构造器
             * 2.要对传入的初始量的合法性进行检测
             * 3.通过新建数组实现
             */
            if(initialCapacity < 0){
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            elementData=new Object[initialCapacity];
        }
    
        // 返回长度
        @Override
        public int size() {
            return size;
        }
    
        @Override
        public boolean isEmpty() {
            // 返回长度是否为0即可
            return size == 0;
        }
    
        // 暂时只考虑直接equals的情况
        @Override
        public boolean contains(Object o) {
            for(Object old : elementData){
                if(o.equals(old)){
                    return true;
                }
            }
            return false;
        }
    
        // 清除数组
        @Override
        public void clear() {
            elementData = new Object[DEFAULT_CAPACITY];
            size = 0;
        }
    
        @Override
        public boolean add(Object object) {
            ensureCapacity();
            elementData[size] = object;
            size++;
            return true;
        }
    
        @Override
        public boolean remove(int index) {
            /*
             * 1.下标合法性检测
             * 2.删除指定下标对象,并返回其值
             * 3.通过数组复制实现
             * 4.因为前移,数组最后一位要置为空
             */
            rangeCheck(index);
            int arrnums=size - index - 1;
            if(arrnums > 0){
                // 思路:从被删除的索引的下一位开始复制给新的当前数组索引的起始位置,长度为size - index - 1 --- 数学问题
                System.arraycopy(elementData, index+1, elementData,index, arrnums);
            }
            elementData[--size]=null;
            return true;
        }
    
        @Override
        public Object get(int index) {
            rangeCheck(index);
            return elementData[index];
        }
    
        // 数组容量检测方法 --- 如果超了就得扩容
        private void ensureCapacity(){
            if(size==elementData.length){
                Object[] newArray=new Object[size * 2 + 1];
                System.arraycopy(elementData, 0, newArray, 0, elementData.length);
                elementData=newArray;
            }
        }
    
        // 对索引下标进行合法性检查
        private void rangeCheck(int index){
            if(index<0||index>=size){
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public String toString() {
            return "MyArrayList{" +
                    "elementData=" + Arrays.toString(elementData) +
                    '}';
        }
    }
  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/kkzhilu/p/12859523.html
Copyright © 2011-2022 走看看