JAVAコレクション

7386 ワード

2016年3月に転職し、トゥーリンロボットの面接中にHashMap、HashtableとTreeMapの違いを聞かれ、意外にも聞かれました.4年間働いていましたが、具体的な問題を解決する際にはまだひっくり返せない穴に遭遇したことがないようです.しかし、最近の面接でも、基礎知識を忘れるべきこと、知らないべきこと、原因を究明するのは、前にまとめるのがおっくうだったり、まとめるのがおっくうだったりすることを深く認識しています.
この問題自体について、帰ってきて勉強した後、次のように答えます.
二つの側面から分析する
一、nullをkeyまたはvalueとして使用できるかどうか
HashMapはnull値をkeyまたはvalueとして使用することができ、nullをkeyとするとHashMapのkeyは重複できないため、nullのEntryを最大1つ保存することができる.nullがvalueである場合、nullのEntryとして複数のvalueを持つことができます.
Hashtableはnull値をkeyまたはvalueとして使用できません.null値をHashtableに入れるとNull PointExecptionとして報告されます.
以上の2つは,内部実装時にkey値に依存してHash原理を用いて要素格納を行う.いずれもMapインタフェースの典型的な実装クラスです.
TreeMapは、SortedMapインタフェースの実装クラスであり、SortedMapはMapインタフェースから継承されます.TreeMap内部では、Keyをソートした赤と黒のツリーデータ構造が維持され、nullをkeyとするとNull PointExceptionになりますが、nullがvalueとして使用される場合はnullのEntryが複数存在します.
検証コードは次のとおりです.
import java.util.HashMap;
import java.util.Hashtable;
import java.util.TreeMap;

public class MapNullTest {

    public static void main(String[] args) {
        //1. HashMap null test
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put(null, null);
        hashMap.put(null, null);
        hashMap.put("a", null);
        hashMap.put("b", null);
        System.out.println("hashMap: " + hashMap);
        
        //2. HashTable null test
        Hashtable<String, String> hashTable = new Hashtable();
        try {
            hashTable.put(null, "a");    
        } catch (NullPointerException e) {
            System.out.println("hashTable put (null, a) NullPointerException");
        }
        
        try {
            hashTable.put("a", null);
        } catch (Exception e) {
            System.out.println("hashTable put (a, null) NullPointerException");
        }
        System.out.println("hashTable: " + hashTable);
        
        //3. TreeMap null test
        TreeMap<String, String> treeMap = new TreeMap<>();
        try {
            treeMap.put(null, "a");    
        } catch (NullPointerException e) {
            System.out.println("treeMap put (null, a) NullPointException");
        }
        
        treeMap.put("a", null);
        treeMap.put("b", null);
        System.out.println("treeMap: " + treeMap);
    }

}

実行結果は次のとおりです.
hashMap: {null=null, a=null, b=null}
hashTable put (null, a) NullPointerException
hashTable put (a, null) NullPointerException
hashTable: {}
treeMap put (null, a) NullPointException
treeMap: {a=null, b=null}

二、スレッドが安全かどうか
HashMapとTreeMapはいずれもスレッドセキュリティではありません.スレッドセキュリティが必要な場合は、CollectionsのsynchronizedXxxx()メソッドを使用して、対応するスレッドセキュリティオブジェクトを取得できます.
Hashtableはスレッドが安全です.
 
Javaコレクションまとめ
JAvaコレクションクラスは主に2つのインタフェースから派生し,CollectionとMapインタフェースである.
一、Collection族
そのサブインタフェースには,Set,Queue,Listインタフェースがある.
1、Set無秩序集合、集合中の要素は繰り返してはいけない、よく使われるSetクラス.
HashSet要素の配列は無秩序であり,スレッド同期ではなく集合中の要素はnullであってもよいが,1つだけあってもよい,そのうちの要素は重複してはいけないので,2つのオブジェクトが等しいか否かを判断する必要があり,判断基準は2つのオブジェクトがequals()でtrueと判断し,hashCode()メソッドの戻り値も等しい.LinkedHashSetはそのサブクラスであり、依然としてHashSetであるが、内部ではチェーンテーブルを使用して要素の追加順序が記録されているため、要素の順序は追加順序と一致している.
TreeSetの内部には赤と黒のツリーを使用して集合要素を格納し、TreeSetの要素を追加するにはComparableインタフェースを実装する必要があります.TreeSetはcompareToメソッドを呼び出して要素を比較してソートする必要があるため、TreeSetの要素順序は、挿入順序ではなくcompareToの比較順序です.TreeSetが2つのオブジェクトが等しいか否かを判断する唯一の基準はcompareTo戻り値が0であるか否かである.内部要素がComparableインタフェースを実装していない場合は、TreeSetオブジェクトを作成するときにその指名ソートルールを指定し、集合に関連付けられた1つのComparatorオブジェクトでソートルールを指名する必要があります.
EnumSetは、Enumオブジェクトのために設計されたSetです.
2.Listは、順序付けされた重複可能な集合を表し、各要素には対応するインデックスがある.
ArrayListの典型的なList実装クラス.
3、Queueシミュレーションキューのデータ構造
PriorityQueue標準の対列実装クラスですが、そのキュー内の要素のソートはエンキュー順ではなく、要素実装のComparableインタフェースや集合にバインドされたComparatorオブジェクト定義の基準に従って並べられ、エンキュー時に要素の並び順でエンキューされます.
DequeはQueueのサブインタフェースです.
ArrayDequeはDequeの典型的な実装クラスであり、双方向キューを実装し、Stackとして使用することもできる.
LinkedListはListインタフェースとDequeインタフェースを実現しているので、Listとしても双方向キューやスタックとしても使用できる強力な結合です.
二、Map族
面接質問の回答を参照してください.また、いくつかの重要な実装クラスがあります.
WeakHashMapは、キーが参照するオブジェクトへの弱い参照を保持し、キーが参照するオブジェクトに他の参照がない場合、キー-valueを自動的に削除して要素の解放を保証します.
Propertiesは、プロパティファイルの読み書きをカプセル化し、key-valueのプロパティファイルをPropertiesオブジェクトに簡単に読み込むことができ、Propertiesオブジェクトをプロパティファイルに簡単に保存することができます.