Javaのジェネリックス
ジェネリックスとは、型を指定することなく、パラメータ化することにより型を定義できるようにすること。
■通常のクラスとクライアントコード
まずは、一般的なコードを見てみる。
クラス
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と違って格納順序を保持する。
TrackBack URL :
Comments (0)