Android開発ノート(二十六)Javaのコンテナ類


容器の分類
集合(Set/HashSet)集合の要素は順序がなく、繰り返してはいけません.これは、指定した要素にインデックスでアクセスできないコレクションのみを巡回し、同じ値を繰り返し追加するとコレクションが大きくならないことを意味します.Setはインタフェースにすぎないので,実際には派生クラスHashSetを用いている.
集合の一般的な方法は次のとおりです.
add:要素の追加
clear:コンテナを空にする
contains:コンテナにその要素が存在するかどうかを判断します
iterator:最初の要素のポインタを取得
isEmpty:容器が空かどうかを判断する
remove:要素の削除
size:コンテナサイズの取得
キュー(ArrayList)キューは、セットとは正反対であり、キュー内の要素は順序付けされており、重複が許可されているため、キューはインデックスを使用して指定された要素(配列の下付き)にアクセスできます.
キューの一般的なメソッドには、上のセットにリストされているいくつかのメソッドが含まれます.次に、変更または追加のメソッドがリストされます.
add:2つの方法が提供されています.デフォルトでは、キューの末尾に要素を追加します.インデックスの場所が指定されている場合は、指定された場所の最後に要素を追加します.
get:指定した場所の要素を取得する
indexOf:指定した要素の最初のインデックス位置を取得する
LastIndexOf:指定した要素の最後のインデックス位置を取得する
remove:2つの方法があります.要素の削除に加えて、指定した場所の要素を削除することもできます.
set:指定した位置の要素を置換する
subList:開始位置から終了位置までの間のサブキューを切り取る
チェーンテーブル(LinkedList)チェーンテーブルは両端キューとも呼ばれます(C++のdequeに似ています)名前の通り、各要素は3つの領域で構成されています.1つは前の要素を指し、1つは後の要素を指し、最後の要素は保存されたオブジェクトです.したがって、最初と最後の要素をすばやく操作する必要がある場合は、チェーンテーブルを使用します.ランダムな要素をすばやく操作する必要がある場合は、キューを使用します.
チェーンテーブルの一般的なメソッドには、上のキューにリストされているいくつか、追加されたメソッドがリストされています.
addFirst/addLast:先頭に追加/末尾に追加
getFirst/getLast:最初の要素の取得/最後の要素の取得
removeFirst/removeLast:先頭要素の削除/末尾要素の削除
offer/offerFirst/offerLast:dequeで要素を追加するのに対し、addはlistで要素を追加する
peek/peekFirst/peekLast:このキューの先頭エレメントを取得しますが削除しません.デフォルトでは先頭エレメントを取得します.
poll/pollFirst/pollLast:このキューの先頭と末尾の要素を取得して削除します.デフォルトでは、先頭の要素を取得して削除します.
pop:スタックの最初の要素、すなわちstack方式で要素を削除する
push:スタックに入力して要素を指定します.すなわち、stackで要素を追加します.
チェーンテーブルにはいくつかの追加と削除方法が実装されており、その違いは以下のようにまとめられています.
リスト形式(list)操作要素:add追加、remove削除
両端キューで要素を操作する:offer追加、poll削除
スタック方式(stack)操作要素:push追加、pop削除
ベクトル(Vector)ベクトルはキューによく似ていますが、キューは非同期で、ベクトルは同期しています.具体的には、1つのベクトルのポインタIteratorが使用されている間に、別のスレッドがベクトルの状態(要素の追加や削除など)を変更すると、ポインタを呼び出す方法が例外(ConcurrentModificationException)を放出します.
ベクトルの一般的な方法はキューと同じで、ソースコードを見ると他のいくつかの名前のelement付き関数が見つかりますが、これらの関数の使い方はキューの対応関数に等しいので、一つ一つ列挙しません.
スタックスタック(Stack)スタックはベクトルから派生し、後進先出スタックを実現する.
スタックの一般的な方法はベクトルより3つ多く、peek(最初の要素を取得)、pop(スタックを出る)、push(スタックに入る)であり、Stackがスタック方式のチェーンテーブルに似ているように見えます.
マッピング(Map/HashMap)マッピングは、キー値ペア(key-value)のマッピング関係を保存します.1つのマッピングに同じkeyを含めることはできません.各keyは1つのvalueしかマッピングできません.しかし、Mapはインタフェースにすぎません.実際によく使われるのは、その派生クラスHashMapです.同様に、キュー、チェーンテーブル、ベクトルはリストインタフェースから派生しています.
マッピングの一般的な方法は次のとおりです.
clear:コンテナを空にする
containsKey:コンテナにキーの要素が存在するか否かを判断する
containsValue:コンテナに値(value)の要素が存在するかどうかを判断します.
get:指定したキーに基づいて要素の値を取得する
isEmpty:容器が空かどうかを判断する
keySet:コンテナ内のキーのセットを取得する
put:キー値ペアのマッピング関係を設定します.元のキーがない場合は、要素を追加します.元のキーが存在する場合は、要素を置き換えます.
remove:指定キーに対応する要素を削除する
size:コンテナのサイズを取得する
values:コンテナ内の値のセットを取得する
ハッシュテーブル(Hashtable)ハッシュテーブルもMapから派生しており、HashMapとは異なり、HashMapは非同期であり、HashTableは同期である.同期にはマシン時間がかかるため,HashTableの実行効率はHashMapより低く,ベクトルやキューの場合と同様である.
ハッシュテーブルの一般的な方法はマッピングと同じであり,一つ一つ列挙しない.
コンテナの遍歴操作
ポインタ遍歴は、上記のコンテナではポインタベースの遍歴操作がサポートされています.ポインタ遍歴は、明示的なポインタと暗黙的なポインタに分けられます.これは、明示的なポインタはIteratorのオブジェクトをインスタンス化する必要があり、暗黙的なポインタは必要ありません.
キューの例として、明示的なポインタと暗黙的なポインタの遍歴コードは次のとおりです.
ArrayList<String> array = new ArrayList<String>();
array.add("111");
array.add("222");
array.add("333");
//    
Iterator<String> it_array = array.iterator();
while(it_array.hasNext()){
    System.out.println("it_array.next()="+(String)it_array.next());
}
//    
for (String item_array : array) {
    System.out.println("item_array="+item_array);
}

集合,チェーンテーブル,ベクトル,スタックのポインタ遍歴はキューと類似しており,ArrayListを対応するコンテナ名に置き換えるとよい.
マッピングのポインタ遍歴は特別であるが、Iteratorは単一パラメータのみをサポートし、マッピングには2つのパラメータがあるため、各マッピング要素のエントリのみをIteratorに伝えることができ、これによりMapが導入する.Entryのコンセプト.具体的な遍歴コードは以下の通りです.
HashMap<String, String> map = new HashMap<String, String>();
map.put("111", "000");
map.put("222", "000");
map.put("333", "000");
//    
Set<Map.Entry<String, String>> entry_set = map.entrySet();
Iterator<Map.Entry<String, String>> it_map = entry_set.iterator();
while(it_map.hasNext()){
    //            ,      getKey getValue
    Map.Entry<String, String> item_next = it_map.next();
    System.out.println("item_next key="+item_next.getKey());
    System.out.println("item_next value="+item_next.getValue());
}
//    
for (Map.Entry<String, String> item_map : map.entrySet()) {
    System.out.println("item_map key="+item_map.getKey());
    System.out.println("item_map value="+item_map.getValue());
}
ハッシュ・テーブルのポインタ・ループ・オペレーションは、マッピングと同様です.
インデックスループは、ポインタループ操作に加えて、キュー、チェーンテーブル、ベクトル、スタックでインデックスループをサポートします.具体的なコードは次のとおりです.
//    
for (int i=0; i<array.size(); i++) {
    System.out.println(String.format("array[%d]=%s", i, array.get(i)));
}
ベクトルは、内部要素が無秩序であるため、インデックスループはサポートされません.
キーセット遍歴マッピングとハッシュテーブルは、ポインタ遍歴に加えて、キーセットの遍歴もサポートします.すなわち、まずコンテナ内のキーセットを取得し、次にキーセットに対するポインタ遍歴を行い、そのキーに対応する値をそれぞれ取得し、具体的なコードは以下の通りである.
Set<String> key_set = map.keySet();
for (String item_key : key_set) {
    System.out.println("item_key="+item_key+", item_value="+map.get(item_key));
}

Android開発ノートの完全なディレクトリを確認します