[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10585] Re: レガシーコレ クションクラス (Re: リファクタリングを読む会第 6 回議事録)



新井です。
参考になるか分かりませんが、Java technology Tips 2月20日版です(Webでは乗ってない
かも)
ポイントは
-------------------------------------
Vector がありますが、これは古いバージョン
のコレクションクラスの一部です。(以前のリリースからのクラスがいくつかあ
りますが、これは Collections Framework に以前のものを組み込むために提供
されており、一般的には新しいプログラムでの使用は推奨されていません。)
-----------------------------------
ですね・・・どこで推奨されていないかは分かりませんが・・

Collections Framework実装の選択

Collections Framework は、Java 2 Platform, Standard Edition (J2SE)の
バージョン 1.2 以降で追加されました。このフレームワークは、データの集まり
(コレクション) を扱うための一連のクラスや、インタフェース、および実装を
提供しています。これらのコアインタフェースの様々な実装を選択することで、
それぞれ異なった動作を実現することができます。このティップでは、ニーズに
合った適切な実装を選択する際の検討事項について、いくつか検証します。

最初に、インタフェースの実装を別のものに変更する際に、プログラムの修正を
最小限にするために、通常は特定の実装ではなくインタフェースにアクセスすべ
きであるということを理解してください。つまり、一般的には以下のように使用
します。

   List list = new ArrayList();
   Set set = new HashSet();
   Map map = new TreeMap();

以下のようには使用しないで下さい。

   ArrayList list = new ArrayList();
   HashSet set = new HashSet();
   TreeMap map = new TreeMap();

このようにすれば、他のコードに影響を与えずにコレクションの実装を変更する
ことができます。

このフレームワークの3つの重要なインタフェースは、Set と List、Map です。
Set は一意の要素のコレクションを提供します。List では、(インデックスを
使って)順序付けられたアクセスが可能ですが、一意性は保証されません。
Map インタフェースは、他の2つとは異なります。Map は単一の要素のコレクシ
ョンを提供するのではなく、キーと値のペアのコレクションを提供します。検索
を行う際には、キーを基にして値を見つけます。言い換えれば、友人の電話番号
を調べるのに似ています。

Set には、Collection Framework の一部として3つの具体的な実装があります。
HashSet と TreeSet、LinkedHashSet です。この3つの実装はすべて一意の要素
のコレクションを提供しています。多くの場合、HashSet を使用しますが、
HashSetの要素は順序付けされていません。順序付けが必要な場合には、TreeSet
を使用することができます。TreeSet は、コレクションの中の要素をソートされ
た順序で保持します。例えば、一連の名前 (MaryとJohn、Sam) が Set にある
場合、TreeSet は、John、Mary、Sam の順番で取り出せます。これに比べて
HashSet の要素の順序は定義されていません。最後に、LinkedHashSet がありま
す。HashSet では、要素の順序が未定義であるのに対して、LinkedHashSet は、
要素が追加された時の順序で取り出すことが可能になります。この
LinkedHashSet は、挿入された順序を管理する補助的なリンクリストを保持して
います。TreeSet と LinkedHashSet が提供する機能を使用する場合は実行時コ
ストを考慮する必要があります。

List インタフェースは、ArrayList と LinkedList という2つ具体的な実装を提
供しています。3つめの実装には Vector がありますが、これは古いバージョン
のコレクションクラスの一部です。(以前のリリースからのクラスがいくつかあ
りますが、これは Collections Framework に以前のものを組み込むために提供
されており、一般的には新しいプログラムでの使用は推奨されていません。)
新しいクラスである ArrayList は、配列を基にしたコレクションを提供してお
り、各要素へ高速にアクセスすることができます。また、要素を末尾に追加した
り削除したりする場合には、効率良く動作します。ArrayList は要素が追加や削
除される際に、内部的な移動操作を行います。これに比べて LinkedList は、末
尾だけでなく、どこの場所であっても追加や削除の操作を行う場合に効率良く動
作します。

LinkedList は要素の追加や削除の際に内部的な移動操作を実行せず、参照ポイ
ンタのみを操作します。しかし、LinkedList の付加的な柔軟性のために余分な
コストが発生し、結果的にはより遅いインデックス付けされた操作となります。
そのため、要素に対して頻繁にランダムなアクセスを行う場合、例えば、「要素
 N の値が欲しい」といったようなリクエストを度々行う場合は、 ArrayList を
使用する方が効率的です。しかし、末尾以外の場所に要素の追加や削除を繰り返
し行う場合は、LinkedList の方が適しています。

最後に紹介するコアインタフェースは、Map です。フレームワークの一部として
提供されている Map の実装は5つあります: HashMap と、TreeMap、
LinkedHashMap、IdentityHashMap、WeakHashMap です。また、以前のバージョン
の実装である Hashtable もあります。その他にも Map の実装はありますが、ニ
ーズに適した実装を選択するのは実際には難しくありません。

・デフォルトでは、HashMap を選択します。一般的には、ほとんど
 のニーズを満たします。

・マップのキーをソートされた順番で保持する必要がある場合には、
  TreeMap の実装を選択します。一方、Map使用後やレポート生成時
 に、キーをソートする必要があるだけなら、追加している間は
 HashMap ですべてを保持し、最後に TreeMap を作成する方がよい
 場合があります。

        Map map = new HashMap();
        // ソートされていないマップへ要素の追加と削除を行う
        map.put("Foo", "Bar");
        map.put("Bar", "Foo");
        map.remove("Foo");
        map.put("Foo", "Baz");
        // ソートされた順序で要素を表示する前にソートを行う
        map = new TreeMap(map);

  この方法ではマップのソートを保持するオーバーヘッドを回避し、
 ソートを行う負荷を最後まで遅らせることができます。

・LinkedHashMap は、LinkedHashSet と同じように動作をします。
  LinkedHashMap は挿入時の順序でマップの要素をたどることがで
 きます。一般的に、要素が Map にあるかどうかをチェックする
 場合、equals メソッドを使用します。

・IndentityHashMap は、 「==」 を使って要素が同じかどうかをチ
 ェックします。厳密な参照による同一性が必要な場合は(おそら
 くまれですが)、IndentityHashMap を使用してください。

・WeakHashMap はあまり使われることはないでしょう。WeakHashMap
 は、キーを弱参照として保持します。弱参照を使用すると、プロ
 グラムはオブジェクトへの参照を保持することができますが、オ
 ブジェクトがガベージコレクタによる再生の対象となるのを避け
 ることができません。キーへのアクセスが弱参照からだけである
 場合は、ガベージコレクタはキーと値のエントリを除くことがで
 きます。弱参照が必要である場合以外は、WeakHashMap の使用は
 避けてください。

Vector の場合と同様に、一般的に新しいプログラムでは Hashtable を使用する
のは避け、HashMap を使うようにします。

このティップで提供したアドバイスは、Collections Framework のインタフェー
スの実装を選択する際に役立つでしょう。しかし、時には2つの実装のどちら
かを選択する場合に、両方を実行して結果を比較した方がよい場合もあります。
2つの実装のどちらを選択するか確定できない場合は、それぞれのインタフェー
スを1万回から2万回操作する簡単なテストプログラムを作成してください。そ
こでどちらが自分の要求に適した動作をするかを判断します。

Collections Framework に関するさらに詳しい情報は、下記をご覧下さい。

"The Collections Framework."
  (英語: http://java.sun.com/j2se/1.4.1/docs/guide/collections/)
  (日本語:http://java.sun.com/j2se/1.4/ja/docs/ja/guide/collections/)


__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/