akcsdno 2020-06-04
创建 Container 类并声明相关的 实例变量 :
public class Container { private Object[] elements ; private int counter ; private float loadFactor ; }
其中:
elements
变量用来引用 存放数据的 Object 数组
每次调用 add( Object ) 方法时,都将新添加的 对象 添加到 elements 数组中
counter
变量充当一个计数器
既用来统计容器中存放的元素个数
又用来确定下次添加元素时(再次调用add(Object)方法时)元素的存放位置
loadFactor
用来表示扩容的时机,也被称作加载因子
就是 当 容器中有效元素的个数( counter 变量的值 ) 超过 elements 数组的长度的指定比例时,就需要 为 容器 扩容
所谓 为容器扩容,就是 换一个 更大的数组来存放元素
首先添加一个带有两个参数的构造方法:
public Container( int initialCapacity , float loadFactor ) { if( initialCapacity <= 0 ) { initialCapacity = 10 ; } this.elements = new Object[ initialCapacity ]; if( loadFactor <= 0 || loadFactor >= 1 ) { loadFactor = 0.75F ; } this.loadFactor = loadFactor ; }
其中
第一个参数 initialCapacity
用来指定容器的初始容量
第二个参数 loadFactor
用来指定 加载因子
随后就可以添加 带有一个参数的构造方法 和 无参构造方法了:
public Container( int initialCapacity ) { this( initialCapacity , 0.75F ); }? public Container() { this( 10 , 0.75F ); }
private void ensureCapacity() { // 当达到某个条件时,就对容器进行扩容 if( counter > elements.length * loadFactor ) { // 将 原来的数组 的地址 暂存到 temp 变量中 final Object[] temp = this.elements ; // 创建新数组 ( 创建一个新的、更大的数组 ) 并将新数组地址赋值到 elements 变量 this.elements = new Object[ temp.length * 3 / 2 + 1 ]; // 将原数组中的[ 0 , counter ) 之间的元素拷贝到新数组中 System.arraycopy( temp , 0 , elements , 0 , counter ); // 后续就使用新数组 (放弃老数组) 了 ( 因为 elements 变量中存储了 新数组的地址 ) } }
public boolean add( Object element ) { this.ensureCapacity(); // 将 element 添加到 elements 数组的 counter 处 elements[ counter ] = element ; // 对 counter 执行 自增操作 ( 增加 1 ) counter++ ; // 自增之后的值既表示元素个数又表示下次添加元素时的存放位置 return true ; }
@Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); builder.append( "\n" ); builder.append( "容器的当前容量是: " + elements.length ); builder.append( "\n" ); builder.append( "容器的元素个数是: " + counter ); builder.append( "\n" ); if( counter > 0 ) { builder.append( "容器中的元素有: " ); for( int i = 0 ; i < counter ; i++ ) { builder.append( elements[ i ] ); builder.append( i < counter -1 ? " , " : "\n" ); } } else { builder.append( "容器中尚未添加有效元素" ); builder.append( "\n" ); } builder.append( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); String s = builder.toString(); return s ; }
public int size() { return this.counter ; }
public boolean isEmpty() { return counter == 0 ; }
public void clear() { this.counter = 0 ; Arrays.fill( elements , null ); }
import java.util.Arrays; public class Container { //elements用来引用 存放数据的 Object 数组 //每次调用 add( Object ) 方法时,都将新添加的 对象 添加到 elements 数组中 private Object[] elements ; //counter充当一个计数器 //既用来统计容器中存放的元素个数 //又用来确定下次添加元素时(再次调用add(Object)方法时)元素的存放位置 private int counter ; //loadFactor用来表示扩容的时机,也被称作加载因子 //一般情况是0.75 private float loadFactor ; //带参构造 //第一个参数 `initialCapacity` 用来指定容器的初始容量 //第二个参数 `loadFactor` 用来指定 加载因子 public Container(int initialCapacity , float d) { if( initialCapacity <= 0 ) { initialCapacity = 10 ; } this.elements = new Object[ initialCapacity ];//创建一个新的数组 if( d <= 0 || d >= 1 ) { d = 0.75F ; } this.loadFactor = d ; } //扩容方法 private void ensureCapacity() { // 当达到某个条件时,就对容器进行扩容 if( counter > elements.length * loadFactor ) { // 将 原来的数组 的地址 暂存到 temp 变量中 final Object[] temp = this.elements ; // 创建新数组 ( 创建一个新的、更大的数组 ) 并将新数组地址赋值到 elements 变量 this.elements = new Object[ temp.length * 3 / 2 + 1 ]; // 将原数组中的[ 0 , counter ) 之间的元素拷贝到新数组中 System.arraycopy( temp , 0 , elements , 0 , counter ); // 后续就使用新数组 (放弃老数组) 了 ( 因为 elements 变量中存储了 新数组的地址 ) } } //增加集合元素的方法 public boolean add(Object element) { this.ensureCapacity(); elements[counter++]=elements; return true; } //判断是否有元素 public boolean isEmpty() { return counter==0; } @Override public String toString() { StringBuilder builder=new StringBuilder(); builder.append( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); builder.append( "\n" ); builder.append( "容器的当前容量是: " + elements.length ); builder.append( "\n" ); builder.append( "容器的元素个数是: " + counter ); builder.append( "\n" ); builder.append( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); if(counter>0) { builder.append("容器的元素有:"); builder.append( "\n" ); for(int i=0;i<counter;i++) { builder.append(elements[i]+" "); } }else builder.append("该容器暂时无元素"); builder.append( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); return builder.toString(); } //获取元素个数 public int size() { return this.counter ; } //清空元素 public void clear() { this.counter = 0 ; Arrays.fill( elements , null ); } }