Comparisons
Java一般 的 なクラスと概念 の比較 表 。
ArrayList vs Vector
| Feature | ArrayList | Vector |
|---|---|---|
| Thread-Safety | デフォルトで非 同期 | デフォルトで同期 |
| Performance | より効率 的 、シングルスレッドアプリケーションに適 している | 同期 により遅 い、マルチスレッドアプリケーションに適 している |
| Growth Rate | 必要 に応 じてサイズを増加 (通常 50%または2倍 ) | 必要 に応 じてサイズを増加 (通常 2倍 )、成長率 を指定 可能 |
| Legacy | Java Collections Frameworkの一部 、汎用 シナリオで推奨 | 元 のJava Collectionクラスの一部 、レガシークラスとみなされる |
Comparable vs Comparator
| Aspect | Comparable (I) | Comparator (I) |
|---|---|---|
| Purpose | オブジェクトが自然 な順序 を定義 できる | カスタムソート順序 を定義 する別 クラスを提供 |
| Interface Method | int compareTo(T o) | int compare(T o1, T o2) |
| Sorting Order | オブジェクトは自然 な順序 でソートされる | カスタムソート順序 を定義 可能 |
| Sortings | オブジェクトは1つの自然
なソート順序
のみ | 異 なるソート順序 に対 して複数 のComparatorを定義 可能 |
| Implementation | 比較 されるオブジェクトのクラスによって実装 | 別 のクラスによって実装 |
| Usage | ソートメソッドによって暗黙
的
に使用
(例
: Collections.sort()) | ソートメソッドに明示 的 に渡 す |
| Multiple Sorting | ソート順序
を変更
するにはcompareTo()メソッドを修正 | ソート順序 を変更 するには別 のComparatorを作成 ・使用 |
| Example | 文字列 リストを辞書 順 でソート | カスタムオブジェクトを特定 の属性 でソート |
| 元 のクラスに影響 する | 元 のクラスに影響 しない |
Comparable
- Use Case : クラスのインスタンスをデフォルトでソートしたい場合 (辞書 順 、数値 の大 きさなど)、ソートロジックがほとんどの場合 変 わらない場合 に使用 。
Comparator
- Use Case : 異
なる属性
や条件
でソートしたい場合
、またはクラスの
compareToメソッドを修正 したくない場合 に使用 。
- Use Case : 異
なる属性
や条件
でソートしたい場合
、またはクラスの
Callable vs Runnable
| Features | Callable | Runnable |
|---|---|---|
| Return value | 値 を返 せる | 戻 り値 なし |
| Exception handling | 検査 例外 をスロー可能 | 検査 例外 をスローできない |
| Method signature | V call() throws Exception | void run() |
| Used in | Future | Thread |
StringBuffer vs StringBuilder
| Key | StringBuffer | StringBuilder |
|---|---|---|
| バージョン | Java 1 | Java 5 |
| 同期 | Yes | No |
| 性能 | スレッドセーフ、遅 い | スレッドセーフでない、StringBufferより速 い |
| 保存 場所 | Heap | Heap |
StringBuffer:override equalsがない、Object equalsは==でメモリアドレスを比較StringBuffer文字列 とString文字列 の比較 は意味 がない、Object equalsは同 じ型 のオブジェクトが前提
Lock vs Synchronized
- Synchronizedブロックは単一
のメソッド内
に含
める必要
がある。
lock.lock()とlock.unlock()は異 なるメソッドから呼 び出 せる。 lock.lock()とlock.unlock()は、synchronizedブロックの入 りと出 と同 じvisibilityとhappens-before保証 を提供- Synchronizedブロックは常 にリエントラント。Lockはそうでない可能性 がある。
- Synchronizedブロックは公平性 を保証 しない。Lockは可能 。
Lock | Synchronized | |
|---|---|---|
| メソッド間 | ⭕ | ❌ |
| ロック取得 を試 みる | ⭕ | ❌ |
| 公平 なロック管理 | ⭕ | ❌ |
| 待機 スレッドのリスト | ⭕ | ❌ |
例外時のロック解放
- Lock
// Situation 1
lock.lock();
doSomethingNifty(); // Throws exception
lock.unlock(); // Oh no, we never release the lock!
// Situation 2
try {
lock.lock();
} finally {
lock.unlock(); // need write unlock() in finally
}- Synchronized
synchronizedコードブロック内
で例外
が発生
した場合
、JVMは現在
のスレッドが取得
したすべてのロックをスマートに解放
し、catchブロックで例外
が処理
されるまで実行
スタックをアンワインドし、処理
されない場合
はスレッドを終了
する。
LinkedList vs Array
| Array | Linked List | |
|---|---|---|
| 格納 構造 | 同 じ型 のデータを格納 | 格納 されるObject内 にDataとPointer(次 のNodeを指 す)が含 まれる |
| メモリ格納 位置 | 要素 は連続 したメモリ位置 に存在 | 要素 はメモリ内 のランダムな位置 に格納 、要素 が次 の要素 を指 す |
| メモリ空間 | 宣言 が必要 | 制限 なし |
| アクセス方法 | indexで検索 | 先頭 からデータを探 す必要 あり |
| 利点 | Search O(1)、高速 なデータ検索 | 追加 ・削除 がArrayより簡単 、O(1) |
| メモリ効率 が良 い | ||
| 欠点 | 追加 ・削除 には配列 全体 の移動 が必要 、O(N)の時間 がかかる | Search O(N)、indexがないため先頭 から検索 |
| pointerを格納 する追加 メモリが必要 |
List.of vs Arrays.asList
| Operations | SINGLETONLIST | LIST::OF | ARRAYS::ASLIST | JAVA.UTIL.ARRAYLIST |
|---|---|---|---|---|
| add | ❌ | ❌ | ❌ | ✔️ |
| addAll | ❌ | ❌ | ❌ | ✔️ |
| clear | ❌ | ❌ | ❌ | ✔️ |
| remove | ❌ | ❌ | ❌ | ✔️ |
| removeAll | ❗️ | ❌ | ❗️ | ✔️ |
| retainAll | ❗️ | ❌ | ❗️ | ✔️ |
| replaceAll | ❌ | ❌ | ✔️ | ✔️ |
| set | ❌ | ❌ | ✔️ | ✔️ |
| sort | ✔️ | ❌ | ✔️ | ✔️ |
| remove on iterator | ❌ | ❌ | ❌ | ✔️ |
| set on list-iterator | ❌ | ❌ | ✔️ | ✔️ |