Java コレクションの一般的な知識のまとめ#
- ArrayList と Vector の違い
- List,Set,Map の 3 つの違い
- Set の要素は重複できない、重複を区別する方法は何か
- ArrayList と LinkedList の違い
- Collection と Collections の違い
- Enumeration と Iterator インターフェースの違い
- ListIterator の特徴
- Java コレクションの fail-fast 迅速失敗メカニズム
- comparable と Comparator の違い
一、ArrayList と Vector の違い#
- ArrayList は非同期で、Vector は同期
- 拡張サイズが異なる:Vector は元のサイズの倍に増加し、ArrayList は元のサイズの 0.5 倍に増加
二、List,Set,Map の 3 つの違い#
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) メソッドを持つ