@blog.justoneplanet.info

日々勉強

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と違って格納順序を保持する。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment