Collection

===========================================================================
CollectionFramework: Java 2でデータ構造を取り扱うための設計
===========================================================================

===========================================================================
CollectionFramework VS exsited API
---------------------------------------------------------------------------
古いAPI: 処理が遅く、データ構造の変更負荷が高い。
コレクションフレームワーク:処理が速く、データ構造の変更負荷が低い。

コレクション・フレームワークの導入に伴い、
古いデータ構造のインタフェース/クラスは、以下のインタフェース/クラスに後継される。

* 可変長配列:Vector→ArrayList
* ハッシュテーブルの設計:Dictionary→Map
* ハッシュテーブルの実装:Hashtable→HashMap
* スタック:Stack→LinkedList
* プロパティ:Properties→パッケージjava.util.profsのクラス群
* 列挙のインタフェース:Enumeration→Iterator

それまでのJDKと互換性あり。

古いデータ構造は、
古いデータ構造は、動作が遅く、他のデータ構造に変換しようとした際に手間取る。
→CollectionFrameworkを使うのが賢明。

ex
クラスVectorを使いたい場合:
サイズの拡張が不要なら配列の方が高速
同期化の必要がないならArrayListの方が高速

===========================================================================
CollectionFramework VS array
---------------------------------------------------------------------------
ArrayList(CollectionClass):
高機能+柔軟
サイズの拡張可能

Array:
高速 (depends on the case)
サイズの拡張不可

for both Vector and ArrayList,
サイズの拡張は一次オブジェクトの生成と破棄を含む負荷の高い処理
拡張なしがbest

※配列でもArraysなら、
二分探索(バイナリ・サーチ)や並べ替え(ソート)などのアルゴリズムの利用可。

===========================================================================
Enumeration vs Iterator
---------------------------------------------------------------------------
Enumeration:古いAPI
Iterator:新しいAPI(CollectionFramework)

IteratorはEnumerationの後継者

===========================================================================
ArrayListへのaddの繰り返しは遅くなる原因?
---------------------------------------------------------------------------
■Summary
・リストに対する挿入、削除を繰り返す場合、
 LinkedListを使うと動作速度が向上。
・リストの途中の要素への挿入/削除を繰り返す場合、
 ArrayListを使うとパフォーマンスが悪化。
 ∵再配列を必要とするため。

□LinkedList
・LinkedListの要素は前後の要素への参照を持つ。
 →2重にリンクされたデータ構造(リンク・リスト)。
 ⇒任意の要素へのランダムアクセス(索引等)ではArrayListの方が高速で、
  順次アクセスや要素の挿入/削除ではLinkedListの方が高速。
  ※HashMap & LinkedHashMap、HashSet & LinkedHashSet as well.
   ex.エントリー数が増える場合は、HashMapよりもLinkedHashMapの方が高速

・LinkedListの特定の索引への挿入/削除に特化したメソッドがある。
 -push()/pop()→スタック
 -addLast()/removeFirst()→先入れ先出し(FIFO)キュー
 -addFirst()/removeLast()→後入れ後出し(LILO)キュー

===========================================================================
the difference of Iterator and ListIterator
---------------------------------------------------------------------------
Iterator:
 要素の削除/置換/追加をサポート
ListIterator:
 要素の削除/置換/追加の他、2方向のカーソル移動をもサポート
 cf.previous()メソッド

===========================================================================
what is [Set] for?
---------------------------------------------------------------------------
Set:
 数学における集合の概念を定義。
 重複を許さない集合を定義するインタフェース。
 特定のオブジェクトが、既存のオブジェクトの集合に含まれてるかどうかを調べる有効的。
 ※Listは重複を許す。

※HashSetとTreeSet
 どちらもSetインタフェースの実装クラス
 *TreeSet:要素がソートされる。

===========================================================================
how to synchronize the collection?
---------------------------------------------------------------------------
□how to
use Collections-class#factory-method
※コレクション・クラスが速いのは同期化されていないから。

複数スレッドからの同時更新による不整合から保護するためには、
synchronized()ブロックでくくるより、
生成時に同期化オブジェクトにラップするのがヨイ。
→煩雑な作業を減って、同期化し忘れることもなくなる。

□同期化のラップ
use Collections-class#synchronizedXxx-method
ex.
 SortedSet ids = new TreeSet();
 SortedSet unmodIds = Collections.synchronizedSortedSet(ids);

 ※unmodIdsはスレッド・セーフ。
 マルチスレッドの共有オブジェクトとして使うときにはunmodIds、
 同期化の必要がなければidsと使い分けることもできる。

 ※こうして作ったオブジェクトは、
  Iteratorによる変更に対してはスレッド・セーフでない。
  →Iteratorを使うときには、明示的にsynchronized()ブロックを使うこと。

===========================================================================

浅煎り珈琲
http://msugai.fc2web.com/java/collection/CollectionsTips.html
2008-02-26 06:46 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud