欠点は、配列ことである:長さが変化しないたら、要素を削除することはできません。不適切な操作が国境を越えた問題のアレイを生成することができます。
私たちは、オブジェクト指向プログラミングのアイデアを理解するために、ArrayBoxクラスを設計するためにJava言語を使用します。
容器がので、すべて容易に横切る、削除し、要素を追加し、より多くのことを行うさせ、また、アレイの使用に起因する欠陥の一部に対処しつつ関数は、配列の要素にアクセスする満たすことができるビューの特定のポイントからArrayBoxクラス信頼性の高いです。
ArrayBox.java
public class ArrayBox<E> {
private static final int DEFAULT_CAPACITY = 10;
private Object[] elementData;
private int size = 0;//记录有效元素的个数
public ArrayBox(int capacity) {
elementData = new Object [capacity];
}
public ArrayBox() {
elementData = new Object [DEFAULT_CAPACITY];
}
public boolean add(E element){//E是创建ArrayBox对象时规定的类型
this.ensureInternalCapacity(size+1);
//如果上面一行代码可以执行完毕,证明数据可以存储成功
// elementData[size] = element;
// size++;这两句可以合并为一句
elementData[size++] = element;//因为size的自增是后执行的
return true;
}
private void ensureInternalCapacity(int minCapacity){
if(minCapacity - elementData.length>0){
//需要的最小容量比总容量还要大,装不下
this.grow(minCapacity);
}
}
//扩容,计算出一个合理的长度newCapacity
private void grow(int minCapacity){
int oldCapacity = elementData.length;
// oldCapacity>>1 右位移表示除以2的1次幂
int newCapacity = oldCapacity + (oldCapacity>>1);
//如果扩容后空间还是不够,那么直接使用所需空间作为我的容量
if(newCapacity - minCapacity <0){
newCapacity = minCapacity;
}
elementData = this.copyOf(elementData, newCapacity);
//经过一番计算,最终获取到一个合理的长度newCapacity
}
//将旧数组的元素全部移入新数组内,需要旧数组和新数组的长度
private Object[] copyOf(Object[] oldArray,int newCapacity){
Object[] newArray = new Object[newCapacity];
for(int i = 0;i<oldArray.length;i++){
newArray[i] = oldArray[i];
}
return newArray;
}
public E get(int index){
//检测index是否合法 大于等于0 &&小于size
this.rangeCheck(index);//如果抛出异常,程序会异常终止
return (E)elementData[index];
}
private void rangeCheck(int index){
if(index<0 || index>=size){
//通过异常来告知用户index不合法
throw new ArrayBoxIndexOutOfBoundsException("index is "+index+" but size only is "+size);
}
}
public E remove(int index){
this.rangeCheck(index);
E oldObject = (E)elementData[index];
for (int i = index; i < size-1; i++) {
elementData[i] = elementData[i+1];
}
// elementData[size-1] = 0;
// size--;
elementData[--size] = null;
return oldObject;
}
public int getSize() {
return size;
}
}
ArrayBoxIndexOutOfBoundsException.java
public class ArrayBoxIndexOutOfBoundsException extends RuntimeException{
public ArrayBoxIndexOutOfBoundsException(){
}
public ArrayBoxIndexOutOfBoundsException(String msg){
super(msg);//msg提供给父类
}
}
注目の点以上のプログラムを要約したものです。
- 私たちは設計基準データ型にアクセスすることがあり得ることのjavaの一般的なセットを使用します。
- コードの可読性を向上させることができ、一定DEFAULT_CAPACITYを使用してください。
- 使用方法は、より柔軟な使用、人工的に所定の配列を構築することができる初期容量のセットような構成パラメータが存在してもよいです。
- 2の累乗を計算する手順を採用変位の計算効率を向上させることができます。