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>