DESKTOP-2IHO1NT_20200907秦文亮

问题


import java.util.Arrays;

public class Test1 {
    
    private static final int XIAOHEI = 10;
    // 声名加载因子
    private static final float DEFAULT_LOAD_FACTOR = 0.75F;
    // 声明一个Object类型的数组变量(引用变量),用来引用存放数据的数组对象
    private Object[] arr;
    // 声明一个Object类型的常量用来填充数组中的"空闲"位置
    private static final Object PRESENT = new Object();

    private int counter;

    private float loadFactor;
    // 缓存区
    private StringBuilder builder = new StringBuilder();

    // 构造
    public Test1() {
        this( XIAOHEI , DEFAULT_LOAD_FACTOR );
    }

    public Test1(int n) {
        this(n, XIAOHEI);
    }

    public Test1(int n, float loadFactor) {
        super();
        if (n <= 0) {
            throw new IllegalArgumentException("容器初始容量必须是正整数");
        }
        if (loadFactor <= 0 || loadFactor >= 1) {
            throw new IllegalArgumentException("加载因子必须是0到1之间的小数");
        }
        arr = new Object[n];
        // 使用 PRESENT 初始化数组
        Arrays.fill(arr, PRESENT);
        // 指定加载因子
        this.loadFactor = loadFactor;
    }

    private void grow() {
        int oldCapacity = arr.length;
        // 当容器中元素个数容量的一定比例时就要扩容了
        if (counter >= oldCapacity * loadFactor) {
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            Object[] array = new Object[newCapacity];// 创建新数组
            Arrays.fill(array, PRESENT); // 填充新数组
            // 将O数组中的[0,counter)之间的元素复制到array的[0,counter)位置
            System.arraycopy(arr, 0, array, 0, counter);
            // 让实例变量elements指向新创建的数组
            arr = array;
        }
                                                
    }

    // 方法 扩容
    public void add(Object a) {
        grow();
        arr[counter] = a;
        counter++;
    }
    //指定位置 x 插入一个新元素 a
    public void add(int x,Object a) {
        if(x<0||x>counter) {//判断插入新元素的索引是否在【0,conter)范围内;否则抛出异常
            throw new IndexOutOfBoundsException( "新插入的元素索引只能是 [ 0 , " + counter + "]"  );
        }
        grow();//扩容
        System.arraycopy(arr, x, arr, x+1,counter-x );//复制数组,从指定位置插入新元素的位置x开始,
        //复制到原数组,从x+开始复制,复制原数组的长度-x的索引个长度;
        arr[x]=a;//把要插入的元素复制到新数组的x索引的位置;
        counter++;//让长度有变换;
    }
    //用新元素替换指定位置 x 的元素并返回原来的元素 o
    public Object set(int x,Object a) {
        if(x<0||x>counter) {
            throw new IndexOutOfBoundsException( "替换元素索引只能是 [ 0 , " + counter + "]"  );
        }
        Object o=arr[x];//返回原来的元素用Object接收
        arr[x]=a;//把替换的元素赋值给指定位置元素的数组;
        return o;//返回原来的元素;
    }       
    //获取指定索引处x的元素
    public Object get(int x) {//定义指定索引x
        if(x<0||x>counter) {
            throw new IndexOutOfBoundsException( "获取元素索引只能是 [ 0 , " + counter + "]"  );
        }
        return arr[x];//返回指定指定索引x的元素
    }
    //删除指定索引处的元素并返回该元素
    public Object remove(int x) {//定义删除的索引x
        if(x<0||x>counter) {
            throw new IndexOutOfBoundsException( "删除元素索引只能是 [ 0 , " + counter + "]"  );
        }
        Object old =arr[x];//删除的元素用Object类的old 接收
        System.arraycopy(arr, x+1, arr, x, counter-x);//复制数组
        //原数组arr,从x+1处开始,复制到新arr数组,从x索引处开始,到原数组的长度减去x的索引个元素;
        counter--;//删除了元素长度就会发生变化;
        return old;//返回删除的元素;
    }

    @Override // 重写toString
    public String toString() {
        builder.setLength(0);
        for (int i = 0; i < counter; i++) {
            builder.append(arr[i]);// 把数组放在缓存区里
            if (i < counter - 1) {// 除了最后一个外,前面的用逗号隔开;
                builder.append(",");
            }
        }
        return "[" + builder.toString() + "]";
    }

    // 返回当前"容器"的容量
    public int capacity() {
        return arr.length;
    }
    
    // 返回当前"容器"的元素个数
    public int size() {
        return counter;
    }

    // 当当前"容器"为空时返回true
    public boolean isEmpty() {
        return counter == 0;
    }
}

测试类


public class Test1Test {

    public static void main(String[] args) {
        
        Test1 d=new Test1();
        d.add("asd");
        d.add("qwe");
        d.add(123);
        d.add("zxc");
        System.out.println(d);
        System.out.println(d.capacity()+"    "+d.size());
        //测试在指定位置插入一个新的元素
        d.add(2, "jiade");
        System.out.println(d);
        d.add(5, 0);
        System.out.println(d);
        //测试用新元素替换指定位置的元素并返回原来的元素 
        d.set(1, "w");
        System.out.println(d);
        //测试获取指定索引处的元素
        System.out.println(d.get(2));
        //测试删除指定索引处的元素
        d.remove(0);
        System.out.println(d);
    }

}

吐槽

好像学会了这几个方法,好难理解;还是好多没有理解的。加油!!!

标签

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1