JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。
本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。
ArrayListとHashSetの違い一覧
| No. | 項目 | ArrayList | HashSet |
|---|---|---|---|
| 1 | 実装インターフェース | Listインターフェースを実装しています。 | Setインターフェースを実装しています。 |
| 2 | 内部構造 | 内部的には配列(動的配列)を使って実装されています。 | 内部的にはHashMapを使って実装されています。 |
| 3 | 要素の順序 | 挿入された順序(インデックス順)を保持します。 | 順序を持たないコレクションであり、要素の並び順は保証されません。 |
| 4 | 重複要素 | 同じ値の要素を複数格納できます(重複を許可)。 | 重複した要素は格納できません(重複を排除)。 |
| 5 | インデックスアクセス | インデックスベースで動作し、get(index)で要素を取得、remove(index)で要素を削除できます。 | オブジェクトそのものを基準に操作するため、get()メソッドは提供されていません。 |
| 6 | null値の扱い | 制限なく複数のnull値を格納できます。 | nullは1つだけ格納可能で、2つ目以降のnullは追加できません。 |
ArrayListの使用例
以下は、ArrayListに要素を追加・削除し、インデックスを使って取得するサンプルコードです。
JavaTester.java
import java.io.*;
import java.util.*;
public class JavaTester {
public static void main(String[] args) throws IOException{
int n = 5;
List<Integer> al = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
al.add(i);
}
System.out.println(al);
al.remove(3);
System.out.println(al);
for (int i = 0; i < al.size(); i++) {
System.out.print(al.get(i) + " ");
}
}
}
実行結果
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
1 2 3 5
この例では、remove(3)によってインデックス3の要素「4」が削除され、残りの要素が順序を保ったまま出力されていることがわかります。
HashSetの使用例
次に、HashSetに同じ値を追加してみます。重複した要素が自動的に除外される様子を確認できます。
JavaTester.java
import java.util.HashSet;
import java.util.Set;
public class JavaTester {
public static void main(String[] args){
Set<Integer> hs = new HashSet<>();
hs.add(1);
hs.add(2);
hs.add(3);
hs.add(4);
hs.add(4);
for (Integer temp : hs) {
System.out.print(temp + " ");
}
}
}
実行結果
1 2 3 4
「4」を2回追加しましたが、出力結果には1度しか表示されていません。これはHashSetが重複を自動的に排除するためです。また、出力順序は挿入順とは限らない点にも注意が必要です。
使い分けのポイント
- 順序を保持したい場合や重複したデータを扱いたい場合は、ArrayListが適しています。
- 重複を排除したい場合や要素の存在確認を高速に行いたい場合は、HashSetが適しています。
このように、両者は目的が大きく異なるため、プログラムの要件に合わせて適切なコレクションを選択することが、パフォーマンスと可読性の向上につながります。
-
JavaのArrayList.clear()とremoveAll()の違いを徹底解説
JavaのArrayListクラスは、Listインターフェースの可変長配列(リサイズ可能な配列)実装であり、null値の格納も許容しています。 このクラスには要素を削除するためのメソッドとしてclear()とremoveAll()が用意されています。どちらもリストから要素を取り除く点では共通していますが、動作内容には明確な違いがあります。本記事では、それぞれの使い方とサンプルコードを交えながら違いを解説します。 clear()メソッドとは clear()メソッドは、現在のListオブジェクトからすべての要素を一括で削除します。引数を受け取らず、呼び出すだけでリストが空の状態になります。 サンプ
-
JavaのArrayListとCopyOnWriteArrayListの違いを徹底解説
Javaにおいて、ArrayListとCopyOnWriteArrayListはどちらもListインターフェースの実装クラスですが、それぞれに重要な違いがあります。本記事では、両者の主な相違点を比較表とサンプルコードを交えてわかりやすく解説します。ArrayListとCopyOnWriteArrayListの主な違いNo.項目ArrayListCopyOnWriteArrayList1同期(スレッドセーフ性)非同期であり、複数スレッドからの同時アクセスは保証されません。同期化されており、ある時点でオブジェクトにアクセスできるのは1つのスレッドのみです。2パフォーマンス同期処理が不要なため、動作