JAvaコンテナ集合クラスの使い分け(Vector ArrayList Map)

20937 ワード

Set,List,Map,Vector,ArrayListの違い
JAVAの容器---List,Map,Set
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collectionインタフェース
Collection Yes
最も基本的な集合インタフェースであり、1つのCollectionはObjectのセット、すなわちCollectionの要素(Elements)を表す.いくつかのCollectionは同じ要素を許可し、他のいくつかはできません.いくつかはソートできますが、他のいくつかはできません.
Java SDKはCollectionから直接継承されるクラスを提供しません.Java SDKが提供するクラスは、リストやSetなどのCollectionから継承される「サブインタフェース」です.
Collectionインタフェースを実装するすべてのクラスには、2つの標準的なコンストラクション関数が必要です.パラメータのないコンストラクション関数は、空のCollectionを作成するために使用され、入力されたCollectionと同じ要素を持つ新しいCollectionを作成するために使用されるCollectionパラメータのコンストラクション関数があります.次のコンストラクション関数では、ユーザーがCollectionをコピーできます.
Collectionの各要素を巡回するにはどうすればいいですか?Collectionの実際のタイプにかかわらず、
いずれもiterator()メソッドをサポートしており、このメソッドは反復子を返し、この反復子を使用してCollectionの各要素に1つずつアクセスできます.典型的な使い方は以下の通りです.
   
 Iterator it = collection.iterator(); //         
    while(it.hasNext()) { 
      Object obj = it.next(); //         
    } 

Collectionインタフェースから派生した2つのインタフェースは
ListとSet.
Listインタフェース
  
Listは秩序化されたCollectionであり、このインタフェースを使用して各要素が挿入される位置を正確に制御することができる.ユーザは、リスト内の要素の位置(配列の下付きと同様)を用いてリスト内の要素にアクセスすることができ、
これはJavaの配列に似ています.
以下に述べるSetとは異なり、
Listは同じ要素を許可します.
Collectionインタフェースに必要なiterator()メソッドに加えて、ListはlistIterator()メソッドを提供し、ListIteratorインタフェースを返します.標準的なIteratorインタフェースに比べて、ListIteratorにはadd()などのメソッドが多く、追加、削除、設定要素を許可し、前後に遍歴することができます.
  
Listインタフェースを実装する一般的なクラスはLinkedList,ArrayList,Vector,Stackである.
LinkedListクラス
LinkedListはListインタフェースを実現し、
null要素を許可します.
さらにLinkedListは、LinkedListの先頭または末尾に追加のget、remove、insertメソッドを提供する.これらの操作により、LinkedListはスタック、キュー、または双方向キューとして使用することができる.
  
LinkedListには同期方法がありません.複数のスレッドが同時にリストにアクセスする場合は、アクセス同期を自分で実現する必要があります.1つの解決策は、Listの作成時に
同期リストを作成するには、次の手順に従います.
    
List list = Collections.synchronizedList(new LinkedList(...));

ArrayListクラス
ArrayListは可変サイズの配列を実現している.nullを含むすべての要素を許可します.
ArrayListは同期していません.
size,isEmpty,get,setメソッドの実行時間は定数です.
しかしadd法のオーバーヘッドは割り当てられた定数であり,n個の要素を追加するにはO(n)の時間が必要である.他のメソッドの実行時間は線形です.
  
各ArrayListインスタンスには、要素を格納する配列のサイズである容量(Capacity)があります.この容量は、新しい要素を追加するにつれて自動的に増加することができるが、成長アルゴリズムは定義されていない.大量の要素を挿入する必要がある場合、挿入前にensureCapacityメソッドを呼び出してArrayListの容量を増やして挿入効率を向上させることができる.
LinkedListと同様にArrayListも非同期である(unsynchronized).
Vectorクラス
VectorはArrayListによく似ています
しかし、Vectorは同期しています.Vectorによって作成されたIteratorは、ArrayListによって作成されたIteratorと同じインタフェースであるが、Vectorが同期しているため、1つのIteratorが作成され使用されている場合、別のスレッドがVectorの状態を変更し(例えば、いくつかの要素を追加または削除した場合)、Iteratorのメソッドを呼び出すとConcurrentModificationExceptionが投げ出され、そのため、この例外をキャプチャする必要があります.
Stackクラス
  
StackはVectorから継承され、後進先出のスタックを実現します.Stackは、5つの追加の方法を提供し、Vectorをスタックとして使用することができる.基本的なpushとpop法、peek法はスタックトップの要素を得、empty法はスタックが空であるかどうかをテストし、search法はスタック内の要素の位置を検出する.Stackが作成されたばかりで空きスタックです.
Setインタフェース
Setは重複する要素を含まないCollectionであり、
すなわち、いずれの2つの要素e 1およびe 2にもe 1.equals(e 2)=falseがあり、Setにはnull要素が最大1つある.
明らかに、Setのコンストラクション関数には、入力されたCollectionパラメータに重複する要素を含めることができない制約があります.
注意:可変オブジェクト(Mutable Object)の操作に注意してください.Setの可変要素が自身の状態を変更した場合、Object.equals(Object)=trueになると、いくつかの問題が発生します.
Mapインタフェース
  
MapはCollectionインタフェースを継承していません.Mapはkeyからvalueへのマッピングを提供します.1つのMapに同じキーを含めることはできません.各キーには1つのvalueしかマッピングできません.Mapインタフェースは、3つのセットのビューを提供し、Mapの内容は、keyセット、valueセット、またはkey-valueマッピングのセットとして使用することができる.
Hashtableクラス
Hashtableはkey−valueマッピングのハッシュテーブルを実現する.空でないオブジェクトはkeyまたはvalueとして使用できます.
追加データはput(key,value)、取り出しデータはget(key)を使用し、この2つの基本動作の時間オーバーヘッドは定数である.
Hashtableはinitial capacityとload factorの2つのパラメータで性能を調整します.通常、デフォルトのload factor 0.75は、時間と空間の等化をより良く実現する.load factorを大きくすると、スペースを節約できますが、対応する検索時間が大きくなり、getやputのような操作に影響します.
Hashtableを使用する簡単な例は、1,2,3をHashtableに配置し、keyはそれぞれ「one」、「two」、「three」である.
   
 Hashtable numbers = new Hashtable(); 
    numbers.put(“one”, new Integer(1)); 
    numbers.put(“two”, new Integer(2)); 
    numbers.put(“three”, new Integer(3));

2のような数を取り出すには、対応するkeyを使用します.
    
Integer n = (Integer)numbers.get(“two”); 
    System.out.println(“two = ” + n); 

keyのオブジェクトとして計算する
ハッシュ関数は、それに対応するvalueの位置を決定するため、keyとしてのオブジェクトはhashCodeメソッドとequalsメソッドを実装する必要があります.
hashCodeメソッドとequalsメソッドはルートクラスObjectから継承されます.カスタムクラスをkeyとして使用する場合は、ハッシュ関数の定義に従って、かなり注意してください.
2つのオブジェクトが同じ、すなわちobj 1.equals(obj 2)=trueの場合、hashCodeは同じである必要がありますが、2つのオブジェクトが異なる場合、hashCodeは必ずしも異なるとは限りません.2つの異なるオブジェクトのhashCodeが同じである場合、この現象を衝突と呼びます.
競合はハッシュ・テーブルを操作する時間のオーバーヘッドを増大させるため、ハッシュ・テーブルの操作を高速化するためにできるだけ良いhashCode()メソッドを定義することができます.
同じオブジェクトに異なるhashCodeがある場合、ハッシュ・テーブルの操作で予想外の結果が得られます(期待されるgetメソッドはnullを返します).このような問題を回避するには、次のことを覚えておく必要があります.
equalsメソッドとhashCodeメソッドを同時に複写し、そのうちの1つだけを書かないでください.
  
Hashtableは同期しています.
HashMapクラス
HashMapはHashtableと似ていますが、違いは
HashMapは非同期であり、null、すなわちnull valueおよびnull keyを許可する.
ただし、HashMapをCollectionと見なす場合(values()メソッドはCollectionを返します)、反復サブオペレーション時間のオーバーヘッドはHashMapの容量に比例します.したがって,反復動作の性能がかなり重要であれば,HashMapの初期化容量を高すぎる,あるいはload factorが低すぎるようにしてはならない.
WeakHashMapクラス
WeakHashMapは改良されたHashMapで、
それはkeyに対して“弱い引用”を実行して、もし1つのkeyがもう外部に引用されないならば、そのkeyはGCで回収することができます.
まとめ
スタック、キューなどの操作に関わる場合は、Listを用いることを考慮すべきであり、
エレメントをすばやく挿入、削除するにはLinkedList、エレメントにすばやくランダムにアクセスするにはArrayListを使用します.
プログラムが単一スレッド環境にある場合、または1つのスレッドでのみアクセスされる場合、非同期クラスを考慮すると効率が高く、複数のスレッドが1つのクラスを同時に操作できる場合は、同期クラスを使用する必要があります.
  
ハッシュ・テーブルの操作に特に注意し、keyのオブジェクトとしてequalsメソッドとhashCodeメソッドを正しく複写します.
  
実際のタイプではなくインタフェースをできるだけ返します.例えば、ArrayListではなくListを返します.これにより、後でArrayListをLinkedListに変更する必要がある場合、クライアントコードは変更されません.これが抽象プログラミングです.

import java.lang.String;
import java.util.*;

public class JAVAContainer {

    // Interfaces:
    // Interface Iterator: hasNext(),  next(), remove() ----            。
    // Interface Collection:add(E e),remove(Object o), clear(), isEmpty(), size(), iterator(), toArray() ----       (map  )     。 
    // Interface Map: put(K key, V value), get(Object key), remove(Object key), clear(),isEmpty(),size(), keySet(), entrySet(), values()  ----   K-V       ,  class: HashMap, Hashtable, IdentityHashMap, LinkedHashMap, ConcurrentHashMap
    // Interface Map.Entry: getKey(), getValue(), setValue(V value) ----     Map  。
    //

    public static void main(String[] args) throws Exception {
        // ArrayList
        {
            ArrayList arraylist = new ArrayList();
            arraylist.add(0, "end");//       
            //      ,    2  ,      5         
            for (int i = 0; i < 2; i++) {
                arraylist.add(i, String.valueOf(i));
            }
            System.out.println("ArrayList:");
            for (int i = 0; i < arraylist.size(); i++) {
                System.out.print(arraylist.get(i) + ";");
            }

            arraylist.add("0");//      ArrayList   
            arraylist.add("0");
            System.out.println("");
            System.out.print(" ArrayList's lastIndexOf(\"0\") is " + arraylist.lastIndexOf("0")); 

            for (Object val : arraylist) {
                System.out.print( val + ";");
            }
            System.out.println("
"); } // Arrays { String[] array = new String[] { "a", "b", "c" }; List list = Arrays.asList(array); System.out.println(" Arrays:"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ";"); } System.out.print(" Arrays's length is " + array.length);// System.out.println(""); for (Object val : array) { System.out.print( val + ";"); } System.out.println("
"); } // Collections { String[] array = new String[] { "a", "b", "c" }; List list = Arrays.asList(array); Collections.fill(list, "Fill");// Fill System.out.println(" Collections:"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ";"); } array = new String[] { "1", "2", "3" }; List list2 = Arrays.asList(array); Collections.copy(list, list2);// list2 list System.out.println(" " + list); Collections.swap(list, 2, 1);// 1 2 System.out.println(list); System.out.println("
"); } // EventObject { String s = "hello"; String s2 = s; EventObject eventobject = new EventObject(s);// , System.out.println("EventObject:"); System.out.println(eventobject.getSource()); System.out.println(eventobject.equals(s2)); System.out.println("
"); } // HashMap { HashMap hashmap = new HashMap();// hashmap.put("0", "c"); hashmap.put("1", "a"); hashmap.put("2", "b"); hashmap.put("3", "a"); System.out.println("HashMap:"); System.out.println(hashmap);// Set set = hashmap.keySet();// Iterator iterator = set.iterator(); while (iterator.hasNext()) { System.out.print(hashmap.get(iterator.next()) + ";"); } System.out.println(""); System.out.println("HashMap: K-V"); iterator = set.iterator(); while (iterator.hasNext()) { Object key = iterator.next(); System.out.print(key+":"+hashmap.get(key) + ";"); } System.out.println(""); System.out.println("HashMap(Entry): K-V"); Set<Map.Entry> kvSet = hashmap.entrySet(); Iterator<Map.Entry> it = kvSet.iterator(); while (it.hasNext()){ Map.Entry entry = it.next(); System.out.print( entry.getKey()+":" + entry.getValue() +";"); } System.out.println("
"); } // HashSet { HashSet hashset = new HashSet();// hashset.add("c"); hashset.add("b"); hashset.add("a"); hashset.add("a"); hashset.add("b"); System.out.println(" HashSet:"); System.out.println(hashset); Iterator iterator = hashset.iterator();// while (iterator.hasNext()) { System.out.print(iterator.next() + ";"); } System.out.println("
"); } // Hashtable { Hashtable hashtable = new Hashtable();// hashtable.put("0", "c"); hashtable.put("1", "a"); hashtable.put("3", "c"); hashtable.put("2", "b"); System.out.println(" Hashtable:"); Enumeration enumeration = hashtable.elements();// ,Enumeration ,Iterator while (enumeration.hasMoreElements()) { System.out.print(enumeration.nextElement() + ";"); } System.out.println("
"); } // IdentityHashMap { IdentityHashMap identityhashmap = new IdentityHashMap(); identityhashmap.put("0", "c"); identityhashmap.put("1", "a"); identityhashmap.put("3", "b"); identityhashmap.put("2", "a"); System.out.println(" IdentityHashMap:"); System.out.println(identityhashmap); System.out.println(identityhashmap.containsKey("3"));// System.out.println(identityhashmap.containsValue("a"));// Set set = identityhashmap.entrySet();// Set System.out.println(set); set = identityhashmap.keySet();// System.out.println(set); System.out.println("
"); } // LinkedHashMap { LinkedHashMap linkedhashmap = new LinkedHashMap(); linkedhashmap.put("0", "b"); linkedhashmap.put("2", "a"); linkedhashmap.put("1", "c"); linkedhashmap.put("3", "b"); System.out.println("LinkedHashMap:"); System.out.println(linkedhashmap); System.out.println(linkedhashmap.containsKey("2"));// System.out.println(linkedhashmap.containsValue("c"));// Set set = linkedhashmap.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()) { System.out.print(linkedhashmap.get(iterator.next()) + ";"); } System.out.println("
"); } // LinkedHashSet { LinkedHashSet linkedhashset = new LinkedHashSet();// Set linkedhashset.add("c"); linkedhashset.add("a"); linkedhashset.add("a"); linkedhashset.add("b"); System.out.println(" LinkedHashSet:"); System.out.println(linkedhashset); System.out.println(linkedhashset.contains("a"));// Iterator iterator = linkedhashset.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + ";"); } System.out.println("
"); } // LinkedList { LinkedList linkedlist = new LinkedList();// linkedlist.add("a"); linkedlist.add(1, "c"); linkedlist.addLast("b"); linkedlist.addFirst("d"); System.out.println(" LinkedList:"); System.out.println(linkedlist); // linkedlist.clear();// // linkedlist.remove(0);// 0 // linkedlist.remove("d");// d // linkedlist.removeFirst();// // linkedlist.removeLast();// for (int i = 0; i < linkedlist.size(); i++) { System.out.print(linkedlist.get(i) + ";"); } System.out.println("
"); } // Stack { Stack stack = new Stack();// stack.add("b"); stack.add(0, "c"); stack.push("d"); stack.add("e"); stack.push("a"); Enumeration enumeration = stack.elements(); System.out.println(" Stack:"); while (enumeration.hasMoreElements()) { System.out.print(enumeration.nextElement() + ";"); } // System.out.println(" " + stack.peek()); System.out.println(stack.pop()); System.out.println(stack.contains("d") + ";" + stack.contains("a"));// , System.out.println(stack.search("c"));// , , System.out.println("
"); } // TreeMap { TreeMap treemap = new TreeMap(); treemap.put("0", "d"); treemap.put("2", "a"); treemap.put("1", "b"); treemap.put("3", "c"); System.out.println(" TreeMap:");// System.out.println(treemap); System.out.println(treemap.firstKey());// Set set = treemap.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()) { System.out.print(treemap.get(iterator.next()) + ";"); } System.out.println("
"); } // TreeSet { TreeSet treeset = new TreeSet();// treeset.add("b"); treeset.add("a"); treeset.add("c"); treeset.add("d"); System.out.println(" TreeSet:"); System.out.println(treeset); System.out.println(treeset.first());// Iterator iterator = treeset.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + ";"); } System.out.println("
"); } // Vector { Vector vector = new Vector(); vector.add(0, "b"); vector.add("a"); vector.addElement("d"); vector.add("c"); System.out.println(" Vector:"); System.out.println(vector); vector.set(2, "h");// System.out.println(vector); Object[] str = vector.toArray(); for (int i = 0; i < str.length; i++) { System.out.print(str[i] + ";"); } vector.setSize(2);// 2 System.out.println(" " + vector); System.out.println("
"); } // WeakHashMap { WeakHashMap weakhashmap = new WeakHashMap(); weakhashmap.put("1", "b"); weakhashmap.put("2", "c"); weakhashmap.put("0", "d"); weakhashmap.put("3", "a"); System.out.println(" WeakHashMap:"); System.out.println(weakhashmap); System.out.println(weakhashmap.containsKey("3"));// System.out.println(weakhashmap.containsValue("d"));// Set set = weakhashmap.entrySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + ";"); } // weakhashmap.remove("2");// // weakhashmap.get("1");// System.out.println("
"); } } }