オブジェクトをグループ化する

2010年04月10日 12時04分 Java



※対象バージョン:Java1.4

配列は値やオブジェクトといったデータの集合であり、型と長さを指定して宣言し、連続したメモリ領域を確保します。配列には宣言した長さの分だけデータを格納することができ、宣言した長さ以上のデータを格納することはできません。また使うデータ以上に長さをとった場合はメモリ領域は無駄になります。

int[] iArray = new int[5]; // int 型の長さ5の配列を宣言

 
C 言語では malloc 関数でメモリを動的に確保することで、動的配列(不定の長さの配列)を実現しますが、Java では Collection や Map という機能を利用することで、不定のサイズのオブジェクトの集合体を扱うことができます。Java で C 言語のような動的配列を扱うには、Collection を利用して実現します。

  • Collection
    Collection は特定のルールに則ってオブジェクトをグループ化する仕組みです。グループ化するルールは Collection の実装クラスによって異なり、利用用途によって使い分けます。
  • Map
    オブジェクトとオブジェクトに関連付けたキーをマッピングして管理する、グループ化の仕組みです。マッピングによる管理方法は Map の実装クラスによって異なります。

 
■List
List はオブジェクトを順序付けて管理するルールに則った Collection の実装クラスです。

  • ArrayList
    内部に配列で利用して、オブジェクトを管理するためのメモリ領域を確保します。一定以上の長さの配列を確保し、足りなくなった場合に再度一定以上の大きい長さの配列を確保します。同期化はされない(非同期)ため、Webアプリケーションなどマルチスレッドでアクセスする場合には、スレッドセーフを意識して利用する必要があります。
  • Vector
    ArrayList とほぼ同等のクラスですが、同期化を実装しているクラスです。マルチスレッドでアクセスする場合にも、スレッドセーフにプログラムを実行することができますが、ArrayList よりも若干ですが実行速度が遅くなります(通常は問題無いレベル)。
  • LinkedList
    リンクリストという個々のオブジェクトに前後のオブジェクトの情報を持たせる方法で List を実現します。このオブジェクト管理の方法により LinkedList はリスト中の挿入や Iterator によるデータの取得においては、ArrayList や Vector よりも高速に処理することができます。ただしリンクリストはランダムアクセスが遅いという欠点があるため注意が必要です。なお同期化はされない(非同期)ため、スレッドセーフを意識して利用する必要があります。
List (ArrayList, Vector, LinkedList)
void add (int index, Object element)
          リスト内の指定された位置に、指定された要素を挿入します。
boolean add (Object o)
          指定された要素をリストの最後に追加します。
boolean addAll (Collection c)
          指定されたコレクション内のすべての要素を、指定されたコレクションの反復子によって返される順序でリストの最後に追加します。
void clear ()

          すべての要素をリストから削除します。

Object get (int index)
          リスト内の指定された位置にある要素を返します。
Iterator iterator ()
          このリスト内の要素を適切な順序で繰り返し処理する反復子を返します。
Object remove (int index)
          リスト内の指定された位置にある要素を削除します。
int size ()
          リスト内の要素数を返します。
Object[] toArray()

          リスト内のすべて要素を適切な順序で格納している配列を返します。

 
■Map
Map はキーをオブジェクトにマッピングしてオブジェクトを管理します。

  • オブジェクト管理にはキーを利用
    オブジェクトを登録する際や、登録したオブジェクトを取得する際にはキーを利用します。ただし同一 Map オブジェクト内ではキーは単一のものである必要があります。
  • 制限は実装クラス次第
    キーやオブジェクトの制限、例えば null の許可などは実装したクラスによります。
// Java 1.4
String str1 = "文字列1";
String str2 = "文字列2";
Map map = new HashMap(); // Map を 実装した HashMap オブジェクトを生成
map.put ("key1", str1); // Map オブジェクトに str1 を登録
map.put ("key2", str2); // Map オブジェクトに str2 を登録
String str3 = (String) map.get("key2"); // "key2" をキーとするオブジェクトを取得

 
Map 自身はインタフェースであり、オブジェクトを直接生成することはできません。Map を実装したオブジェクトは、処理やキーやオブジェクトの管理方法が異なります。

  • Hashtable
    ハッシュテーブルを利用して Map の実装を行います。ハッシュテーブルとは、キーに対してある計算(ハッシュ)を行い、キーを一意の数字に変換し、事前に確保したメモリ領域で管理するための番号として利用することで、オブジェクトを管理します。キーやオブジェクトにはnull 以外を指定する必要があります。同期化されているため、スレッドセーフを意識する必要はありません。
  • HashMap
    基本的には Hashtable と同じですが、非同期であることとキーやオブジェクトに null が利用可能です。
  • TreeMap
    順序を持たせることが可能な Map の実装クラスです。順序のアルゴリズムを組み込むことで、キーにより整列させてオブジェクトを取得可能です。null の利用は可能です。同期化されていない(非同期)ため、スレッドセーフを意識して利用する必要があります。
Map (Hashtable, HashMap, TreeMap)
void clear ()
          マップからマッピングをすべて削除します。
Object get (Object key)
          マップが指定のキーをマップする値を返します。
Set keySet ()

          マップに含まれているキーのセットビューを返します。

Object put (Object key, Object value)
          指定された値と指定されたキーをこのマップに関連付けます。
Object remove (int index)
          このキーにマッピングがある場合に、そのマッピングをマップから削除します。
int size ()
          マップ内のキーと値のマッピングの数を返します。
Collection values ()
          マップに含まれている値のコレクションビューを返します。

 
■Set
Set は重複したオブジェクトを管理しない Collection の実装クラスです。通常は他の Collection オブジェクトに関連付けて利用します。

  • 重複したオブジェクトを追加できない
    順序も管理するキーも持たないため同じオブジェクトを登録することができません。
  • 他の Collection とセットで利用
    通常は Set のみの利用はせず、他の Collection オブジェクトと一緒に利用します。
// Java 1.4
String str1 = "文字列1";
String str2 = "文字列2";
Set set = new HashSet(); // Set を 実装した HashSet オブジェクトを生成
set.add(str1); // Set オブジェクトに str1 を登録
set.add(str2); // Set オブジェクトに str2 を登録
Iterator it = set.iterator();
String str3 = (String) it.next(); // str1 のオブジェクトを取得

 
Set は単独で利用することは通常無いので、実装クラスの説明はここでは省略します。

Set (HashSet, TreeSet, LinkedHashSet)
boolean add (Object o)
          指定された要素がセット内になかった場合、セットに追加します。
boolean addAll (Collection c)
          指定されたコレクションのすべての要素について、その要素がこのセット内にない場合、セットに追加します。
void clear ()

          セットからすべての要素を削除します。

Iterator iterator ()
          セット内の要素についての反復子を返します。
Object remove (int index)
          指定された要素がセット内にあった場合、セットから削除します。
int size()
          セット内の要素数 (カーディナリティ) を返します。
Object[] toArray()
          セット内のすべての要素が格納されている配列を返します。


Leave a Reply

preload preload preload