ジェネリックスとは、型を指定することなく、パラメータ化することにより型を定義できるようにすること。
■通常のクラスとクライアントコード
まずは、一般的なコードを見てみる。
クラス
public class Dog { private String _name; public Dog(String name) { this._name = name; } public String cry() { return this._name + ", bow!"; } }
クライアントコード
上述の場合、以下のようにして使用することができる。
public class HelloWorld { public static void main(String[] args) { Dog pochi = new Dog("pochi"); System.out.println(pochi.cry()); } }
しかし、以下のようにして使用することはできない。
public class HelloWorld { public static void main(String[] args) { Dog pochi = new Dog(123); System.out.println(pochi.cry()); } }
クラス
以下のように、全てのクラスと互換性があるObjectとすることで使用することができるようになる。
public class Dog { private Object _name; public Dog(Object name) { this._name = name; } public String cry() { return this._name + ", bow!"; } }
■ジェネリックスを用いたコード
インスタンス化する時に使用する型を指定する。
クラス
public class Dog<T> { private T _name; public Dog(T name) { this._name = name; } public String cry() { return this._name + ", bow!"; } }
クライアントコード
public class HelloWorld { public static void main(String[] args) { Dog<String> pochi = new Dog<String>("pochi"); System.out.println(pochi.cry()); Dog<Integer> shiro = new Dog<Integer>(123); System.out.println(shiro.cry()); } }
これはデータ構造などのクラスにおいて多用される。
■コレクション
List
List自体はインターフェースである。
ArrayList
可変長配列を表す。
ArrayList<String> ary = new ArrayList<String>(); ary.add("hoge"); ary.add("fuga"); for(int i = 0; i < ary.size(); i++){ Log.e("", "ary[" + String.valueOf(i) + "] = " + ary.get(i)); }
ちなみに以下のようにするとエラーになる。
ArrayList<String> ary = new ArrayList<String>(); ary.add("hoge"); ary.add(2, "fuga"); for(int i = 0; i < ary.size(); i++){ Log.e("", "ary[" + String.valueOf(i) + "] = " + ary.get(i)); }
Cとか本来の配列に可変長を持たせたものであり、JavaScriptやPHPの配列とは異なる。
LinkedList
連結リストを表す。
LinkedList<String> ary = new LinkedList<String>(); ary.add("hoge"); ary.add("fuga"); ary.add(1, "piyo"); for(int i = 0; i < ary.size(); i++){ Log.e("", "ary[" + String.valueOf(i) + "] = " + ary.get(i)); }
配列の途中への追加や削除がO(1)のコストでできるデータ構造。
Set
集合。要素の重複を許容しない。
HashSet
任意の順序で要素を保持する。
HashSet<String> hash = new HashSet<String>(); hash.add("hoge"); hash.add("hoge"); hash.add("hoge"); Log.e("hash", hash.toString()); // [hoge]
LinkedHashSet
HashSetとは異なり要素の順序を保持する。
Queue
PriorityQueue
優先順位つきキュー。探索とかでよく使う。
Map
HashMap
連想配列。但し格納順書は保持しない。
HashMap<String, Object> map = new HashMap<String, Object>();
HashMap<String, HashMap<String, String>> map = new HashMap<String, HashMap<String,String>>();
LinkedHashMap
HashMapと違って格納順序を保持する。