zoukankan      html  css  js  c++  java
  • Java

    2.设计一个类 模拟数组的添加和删除

    //模拟ArrayList的存入删除
    public class ArrayBox<T> {
        //使数组的长度不可变
        private static final int DEFAULT_CAPACITY = 10;
        private Object []elementData;//长度一旦确定不能再次发生改变
        //记录数组的有效长度
        private int size = 0;
    
        public ArrayBox(){
            elementData = new Object[DEFAULT_CAPACITY];
        }
        public ArrayBox(int capacity){
            elementData = new Object[capacity];
        }
        //查看数组是否能装下新存放的数据,如果不能 就进行扩容
        private void ensureCapacityInternal(int minCapacity){
           //如果数据长度大于创建的数组的长度,就进行扩容
            if(minCapacity>elementData.length){
               //扩容方法
                this.grow(minCapacity);
           }
        }
        //扩容方法
        private void grow(int minCapacity){
            int oldArrayLength = elementData.length;
            int newArrayLength = oldArrayLength + (oldArrayLength>>1);//扩容1.5倍
            if(newArrayLength < minCapacity){
                newArrayLength = minCapacity;
            }
            elementData = this.copyOf(elementData,newArrayLength);
        }
        //将旧数组的数据传入新数组,由于数组长度不可变,所以需要创建一个新数组
        private Object[] copyOf(Object [] oldArray,int newArrayLength){
            Object [] newArray = new Object[newArrayLength];
            for (int i=0; i<oldArray.length; i++){
                newArray[i] = oldArray[i];
            }
            return newArray;
        }
        //判断索引是否越界
         private void rangeCheck(int index){
            if(index<0 || index>=size){     //index有效 <= size - 1
                //参考数组的操作  自己定义一个异常(自己创建的类)来说明这个问题
                throw new MyException("Index:"+index+",Size:"+size);
            }
        }
        //---------------------------------
        //添加元素
        public boolean add(int element){
            //确保我自己的属性数组的内部容量
            this.ensureCapacityInternal(size+1);
            //size 是有效元素的个数,所以应该从1开始存储
            elementData[size++] = element;
            return true;
        }
        //获取索引位置的元素
        public T get(int index){
            //检测index范围
            this.rangeCheck(index);
            return (T)elementData[index];
        }
        //删除元素,并可以获得删除的元素
        public T remove(int index){
            //检测index范围
            this.rangeCheck(index);
            T oldValue = (T)elementData[index];
            for(int i=index;i<size-1;i++){
                elementData[i] = elementData[i+1];
            }
            elementData[--size] = null;//末尾元素清空
            return oldValue;
        }
        //获取数组长度
        public int size(){
            return this.size;
        }
    }
    //自己的异常类
    public class MyException extends RuntimeException {
        public MyException(){}
        public MyException(String msg){
            super(msg);
        }
    }
  • 相关阅读:
    使用require.context引入模块
    npm link的使用
    mysql 链接远程数据库
    微信错误:errcode=45015, errmsg=response out of time limit or subscription is canceled
    微信公众号发送模板消息
    VS CODE 开发php实现断点调试
    uni 蓝牙 安卓 监听不到返回数据 不可写入
    vue3.0 兄弟组件传值
    二叉查找树的实现和删除
    模块二:ES新特性与TypeScript、JS性能优化
  • 原文地址:https://www.cnblogs.com/yyanghang/p/11061662.html
Copyright © 2011-2022 走看看