ArrayListは、自動的に配列大きさが増加する
任意オブジェクトの配列を管理するクラスです。
(このような配列は可変長配列と呼ばれます)
通常の配列は最初に要素数を決めてその要素数は変化しません。
対してArrayListの内部配列は、addメソッドを使うことで
自動的に増えていきます。
この配列要素に添え字を指定してオブジェクトを設定する時は、
setメソッドを使います。
また、添え字を指定してこの配列要素を取得する場合は、
getメソッドを使います。
そして、内部配列で管理される要素数は、lengthでなく、代わりに
sizeメソッドで取得します。
次の例では、空の可変長配列オブジェクトを変数 lst で管理させ、
そこにRecord2のオブジェクト3つ追加(add)します。
それぞれのオブジェクトは、
追加の順番で内部的に0,1,2の添え字で管理されます。
その後、1の添え字要素をRecord3のオブジェクトに設定(set)し直し、
各要素を順番に取得(get)して表示します。
この表示は、0番目から要素数(size)未満の繰り返しで、
全て表示するプログラムです。
import java.util.ArrayList;
import rec.Record2;
import rec.Record3;
public class Test
{
public static void main(String[] arg) throws Exception
{
ArrayList<Record2> lst = new ArrayList<Record2>();
lst.add(new Record2("A01", 10));//追加により、自動的に内部サイズが増えます。
lst.add(new Record2("A02", 20));
lst.add(new Record2("C03", 30));
lst.set(1, new Record3("B02", 20, 200)); //1の添え字要素を、生成したRecord3へ変更
for(int i=0; i < lst.size(); i++){
Record2 rec = lst.get(i); //i番目要素
rec.display(i);
}
}
}
の2行は、
lst.get(i).display(i);の
一行にまとめることができます。
以下に、この実行を示します。
Z:\java>java Test
0番目レコード
商品コード:A01
数量:10
1番目レコード
商品コード:B02
数量:20
単価:200
2番目レコード
商品コード:C03
数量:30
Z:\java>
なお、上記の,<Record2>の部分が、
Genericsの部分に指定した利用する時の型指定です。
このような可変長配列のコードはどのようになっているのでしょうか?
実際のコードは、JDKのインストールディレクトリの中のsrc.zip内の
java.utilパッケージにあり、実際のコードを見るのが良いでしょう。
上記を実行できる限定版のArrayListであれば次のように作れます。
(実際のjava.util.ArrayListコードはもっと複雑ですが、Genericsの例として参考に示します)
public class ArrayList <T>{
private int upSize=3;
T [] data= (T [])new Object[upSize];
int size=0;
public boolean add(T obj){
if(size >= data.length){//記憶できるようにサイズ拡大
T [] temp = (T [])new Object[data.length + upSize];
System.arraycopy(data, 0, temp, 0, data.length);//tempにdata全要素をコピー
data = temp; // 増やした新しい配列に置き換える。
}
data[size++] = obj;
return true;
}
public int size(){//サイズ取得
return this.size;
}
public T get(int index){//要素取得
return data[index];
}
public T set(int index , T obj){//要素変更
T rtnObj = data[index];
data[index] = obj;
return rtnObj;
}
}
|
これを使って、メニュー操作で追加と変更ができる簡単な作品を紹介します。 |
Z:\java>java Test
a:追加、c:変更、e:終了>a
追加データ: 商品コード>>A01
数量>>10
0番目レコード
商品コード:A01
数量:10
a:追加、c:変更、e:終了>a
追加データ: 商品コード>>bbb
数量>>0
0番目レコード
商品コード:A01
数量:10
1番目レコード
商品コード:bbb
数量:0
a:追加、c:変更、e:終了>a
追加データ: 商品コード>>C03
数量>>30
0番目レコード
商品コード:A01
数量:10
1番目レコード
商品コード:bbb
数量:0
2番目レコード
商品コード:C03
数量:30
a:追加、c:変更、e:終了>c
変更する添え字>1
変更データ: 商品コード>>C02
数量>>20
0番目レコード
商品コード:A01
数量:10
1番目レコード
商品コード:C02
数量:20
2番目レコード
商品コード:C03
数量:30
a:追加、c:変更、e:終了>e
Z:\java>
|
←正しく修正してからクリックください。
←わからない場合は、クリック
Z:\java>java Test a:追加、c:変更、e:終了>a 追加データ:AAA AAA a:追加、c:変更、e:終了>a 追加データ:b AAA b a:追加、c:変更、e:終了>a 追加データ:CC CCC AAA b CC CCC a:追加、c:変更、e:終了>c 変更する添え字>1 変更データ:BB AAA BB CC CCC a:追加、c:変更、e:終了>e Z:\java>