Java コレクションの一般的な知識のまとめ#
- ArrayList と Vector の違い
- List,Set,Map の違い
- Set の要素は重複できない、重複を区別する方法
- ArrayList と LinkedList の違い
- Collection と Collections の違い
- Enumeration と Iterator インターフェースの違い
- ListIterator の特徴
- Java コレクションの fail-fast 迅速失敗メカニズム
- comparable と Comparator の違い
一、ArrayList と Vector の違い#
- ArrayList は非同期で、Vector は同期です
- 拡張サイズが異なる:Vector は元のサイズの倍に増加し、ArrayList は元のサイズの 0.5 倍に増加します
二、List,Set,Map の違い#
List
:List インターフェースは一組の非一意(同じオブジェクトを参照する複数の要素を持つことができる)、順序付きのオブジェクトを格納しますSet
: 重複を許さない集合です。同じオブジェクトを参照する複数の要素は存在しません。Map
: キーと値のペアを使用して格納します。Map は Key に関連付けられた値を維持します。2 つの Key は同じオブジェクトを参照できますが、Key は重複できません。典型的な Key は String 型ですが、任意のオブジェクトでも構いません
三、Set の要素は重複できない、重複を区別する方法#
key の存在を判断し、== と equals () メソッドの両方を使用します。追加された要素が同じ場合、挿入されず、直接 value 値が変更されます
== と equals の違い#
==
は 2 つの変数またはインスタンスが同じメモリ空間を指しているかどうかを判断し、equals は 2 つの変数またはインスタンスが指しているメモリ空間の値が同じかどうかを判断します==
はメモリアドレスを比較し、equals () は文字列の内容を比較します==
は参照が同じかどうかを指し、equals () は値が同じかどうかを指します
HashSet はどのようにデータの重複を防ぐのか?#
オブジェクトを HashSet に追加すると、HashSet は最初にオブジェクトの hashcode 値を計算して判断します。同じ hashcode 値のオブジェクトが見つかった場合、equals () メソッドを呼び出して hashcode が等しいオブジェクトが本当に同じかどうかを確認します
四、ArrayList と LinkedList の違い#
- ArrayList の基盤は
Object配列
を使用し、LinkedList の基盤は双方向リスト
データ構造を使用します(JDK1.6 以前は循環リスト、JDK1.7 で循環が廃止されました) - LinkedList は効率的なランダム要素アクセスをサポートしていませんが、ArrayList はサポートしています。迅速なランダムアクセスは要素のインデックスを通じて要素オブジェクトを迅速に取得することによって行われます(get (int index) メソッドに対応)
- メモリ空間の占有:ArrayList の空間の無駄は、リストの末尾に一定の容量を予約することに主に現れ、LinkedList の空間の消費は、各要素が ArrayList よりも多くの空間を消費する必要があることに現れます(直接の後続と直接の前駆およびデータを保存するため)
五、Collection と Collections の違い#
- Collection は集合の上位インターフェースで、Set と List インターフェースがそれを継承しています
- Collections は集合のユーティリティクラスで、集合の検索、探索、同期などの操作に対する一連の静的メソッドを提供します
六、Enumeration と Iterator インターフェースの違い#
Iterator は Enumeration の代わりで、Enumeration は古いイテレータです
- Iterator には fail-fast メカニズムがあり、Enumeration よりも安全です
- Iterator は要素を削除できますが、Enumeration は要素を削除できません
七、ListIterator の特徴#
- ListIterator は Iterator インターフェースを継承し、List 集合の要素を遍歴するために使用されます。
- ListIterator は双方向遍歴、要素の追加、要素の設定を実現できます
八、Java コレクションの fail-fast 迅速失敗メカニズム#
fail-fast メカニズムは java コンテナ(Collection と Map の両方に fail-fast メカニズムが存在します)におけるエラーのメカニズムです。コンテナオブジェクトを遍歴する際、コンテナの構造が変更されると、ConcurrentModificationException
がスローされる可能性が高く、fail-fast が発生します
どのような場合に fail-fast が発生するか#
- 単一スレッド環境:集合を遍歴する過程で、集合の構造が変更されます。注意、listIterator.remove () メソッドで集合の構造を変更してもこの例外はスローされません。
- マルチスレッド環境:あるスレッドが集合を遍歴する過程で、別のスレッドが集合の構造を変更しました
実装原理#
集合内部は modCount
変数を維持しており、集合ノードを遍歴する際にmodCount
とexpectedModCount
が等しいかどうかを判断します。等しくない場合は、すでにスレッドが集合の構造を変更したことを示します
九、comparable と Comparator の違い#
- comparable インターフェースは実際には java.lang パッケージから来ており、ソートのために compareTo (Object obj) メソッドを持っています
- comparator インターフェースは実際には java.util パッケージから来ており、ソートのために compare (Object obj1, Object obj2) メソッドを持っています