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);
        }
    }
  • 相关阅读:
    1.1 git和github -1 介绍
    seajs使用
    seajs使用-1 解决冲突和依赖
    6. 菜单切换
    5. 背景半透明 元素不透明(兼容所有浏览器)
    4. 父元素如何包含子元素
    3. js 多维数组转为一维数组
    2. 伪数组转为数组 Array.prototype.slice.call(arguments)
    3. 伪元素清除最后一个border的边框
    2. 详解 CSS 属性
  • 原文地址:https://www.cnblogs.com/yyanghang/p/11061662.html
Copyright © 2011-2022 走看看