DESKTOP-1K7LKMB_20200907-马思宇

集合(collection)

/ 声明一个表示"容器"的默认容量的常量
private static final int DEFAULT_CAPACITY = 10;
// 声明一个表示默认加载因子的常量
private static final float DEFAULT_LOAD_FACTOR = 0.75F ;

// 声明一个Object类型的常量用来填充数组中的"空闲"位置
private static final Object PRESENT = new Object();

// 声明一个Object类型的数组变量(引用变量),用来引用存放数据的数组对象
private Object[] elements ;

// 声明一个int类型的变量:
// 该变量可以用来统计"容器"中已经放入的有效元素的个数、
// 同时也用于确定下一个元素的存放位置
private int counter ;

private float loadFactor ;

// 为了将"容器"中存放的元素转换成字符串时使用缓冲区
private StringBuilder builder = new StringBuilder();

public Container() {
    this( DEFAULT_CAPACITY , DEFAULT_LOAD_FACTOR );
}

public Container( int initialCapacity ) {
    this( initialCapacity , DEFAULT_LOAD_FACTOR );
}

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

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