Listの使い方
よく世間では「リスト」と言う言葉を使用します。「〜のリスト作っておいて!」などといったりします。しかし、左のリストとここでいうリストは別物で、JavaAPIにある「Listインターフェースクラス」のことです。
まずは実装してみたので、こんな感じかな?と言うのをみてもらうのが早いと思います。
このリストはJavaAPIに存在していて完全クラス名はjava.util.List
です、そして、詳細な説明があるJavaDocはこちらのリンク先にあります。
クラスと言いましたが、これは「インターフェース・クラス」実体のないクラスです。これは実体のあるクラスを格納できる変数だと思ってもらえれば、ある程度はわかりやすいと思います。そして、実体とは処理の中身のことをいいます。
更にういなら、実体のない時はメソッドの型のみで、実体のある時は中かっこがついてます。
Listインターフェース・クラス
List<String> list1 = new ArrayList<String>();
他にも下のような実装もできます。
List<String> list1 = new LinkedList<String>();
JavaDocにある既知の全ての実装クラスと言う部分に記載のあるクラスは同じように扱うことができます。
Listの扱い方
Listインターフェースクラスの実装に関して、既知の実装クラスでよく使用されるのが「ArrayList」クラスです。このクラスは、可変長配列の実装です。なので配列の長さを気にせずに、配列にデータを追加、削除することができます。
つまり、昔の配列は配列の長さを調節する処理が必要だったわけです。先人たちの苦労を無駄にしないようにクラスという形で残っていると思うと少し感慨深いですね。
Listインターフェースクラスのサンプル実装
public void test03() {
// OK牧場(笑)
List list = new ArrayList();
list.add("test01");
list.add("test02");
list.add("test03");
List list1 = new LinkedList();
list1.add("public1");
list1.add("public2");
list1.add("public3");
this.systemOut(list);
this.systemOut(list1);
}
private void systemOut(List list) {
// FOR文
for(int i = 0; i < list.size(); i++) {
System.out.println("リスト(" + i + "): " + list.get(i));
}
// 拡張FOR文
for(String value : list) {
System.out.println("リスト: " + value);
}
} ```
上記のように、扱い方は同じですが、微妙に違いがあります。
* ArrayList: サイズ変更可能な配列の実装です。※可変長配列
* LinkedList: 両端で要素の挿入および削除をサポートする線形コレクション
【配列の扱いあれこれ】
配列を使用して様々なデータを検証、編集など
色々な処理を行いますが何かと不便なこともあります。
String[] args = new String[5];
の様に初期化した場合→test01();
この場合は、配列の数が決まるので困る時があります。
例:標準入力を受けるとき
byte[] b = new byte[5];
System.in.read(b);
上記の場合は、5文字までを受け取ることができます。
少なかったり多かったりすると上手くないのです。。。
なので前回は、BufferedReaderを使用してそこを解消しました。
そこで、初めの配列(byte[] b)をString[], int[]などに変更した場合
かつ標準入力出ない場合はどうしたら良いでしょうか?
【Listクラスを使用する】
ここで、Listが出てきます。完全修飾名(完全クラス名)は
「java.util.List」クラスです。正しくはインターフェースクラスになります。
このインターフェースは以下のクラスに実装されています。
他にもあるけれど、使用頻度の高いものを記載します。
・java.util.ArrayListクラス(完全修飾名)
・java.util.LinckedListクラス(完全修飾名)
・java.util.Vectorクラス(完全修飾名)
これらのクラスにはclass名の後に「implements java.util.List」
が記載されています。
これが「実装する」という意味です。
// インターフェースの定義
public interface List { ....}の様に記載します。
実際のjava.util.Listインターフェースの内容は
Eclipseを使用しているならListの文字の上で「F3」を押下すると
ソースを見ることができます。
実際のインターフェース定義は以下になります。
public interface List<E> extends Collection<E> {
// Query Operations
インターフェース定義でも「extends」とありますが
とりあえず置いておきます。
ではインターフェースって何?となると思います。
インターフェースはクラスに実装(implements)することにより
インターフェースで複数のクラスを一つの変数で扱えます。
例として、ListはArrayListとLickedListをListの変数で使用できます。
List<String> list = new ArrayList<String>();
// OK牧場(笑)
List<String> list1 = new LinkedList<String>();
の様に別のクラスでも同じ変数で使用することができます。
【追伸】
List<変数の型>の「変数の型」の部分は、ジェネリクスと言います。
コードが長くなってくるとこのリストの中身はなんだった?
とわからなくなってしまいます。それを解消したのがこの
「ジェネリクス」です。
その他Map, Set, Vectorなどで使用します。
でわでわ。。。