こんにちは、コイキングです。
本記事では'リスト(List)'について、説明したいと思います。
1. リスト(List)とは?
リストはJavaでデータ構造とデータを取り扱うためのコレクションフレームワークに属するインターフェースです。
配列のように順序があるデータを格納するためのデータ構造で、リストを実装しているクラスはArrayList, LinkedList, Vectorなどがあります。
2. ArrayList
1) アレイリスト(ArrayList)とは?
'ArrayListは長さが変更できる配列'のようなデータ構造です。
ArrayListのクラス内部を見れば配列を使いデータを格納していることが分かります。
※ 長所
- 配列のようにインデクスを使い、速やかに要素にアクセスできます。
※ 短所
-
長さが変わる際の処理に時間がかかる。
リストにデータを入れてみるとリストの内部のデータを格納する配列の長さを超える場合がある。この時長さを増やした新しい配列に既格納していたデータをコピーする処理が行われる。 - リストの各要素の削除処理に時間がかかる
※ 主に使われているところ
- リストに格納するデータの量が一定的で、データの入力・削除が少ないところ。
- データのアクセス速度が重要なところ。
2) データの挿入
add()メソッドを使いデータをリストに格納できます。
List<String> list = new ArrayList<String>();
list.add("ArrayList-String01"); // Index 0
list.add("ArrayList-String02"); // Index 1
list.add("ArrayList-String03"); // Index 2
list.add("ArrayList-String04"); // Index 3
list.add("ArrayList-String05"); // Index 4
3) データの出力
インデクスを指定して出力
get()メソッドにインデクス番号を渡して、データにアクセス・出力できます。
System.out.println("Index 2番のデータ出力 : "+ list.get(2));
全体データ出力(for-each)
拡張for文を使うと簡単に全体データが出力できます。
for (String str : list) {
System.out.println("Using for-each : "+str);
}
全体データ出力(for文とインデクス番号)
for文とインデクス番号、get()メソッドを使い全体データを出力できます。
// ※ sizeメソッドにて、リストの長さが分かります。
for (int i=0; i<list.size(); i++) {
System.out.println("Using for Index ["+i+"] : "+list.get(i));
}
全体データ出力(forEachメソッド)
forEach()メソッドを使うと簡単に全体データが出力できます。
list.forEach(str -> {
System.out.println("Using forEach() : "+str);
});
4) データ更新
set()メソッドにインデクス番号と更新する値を渡して、データを更新できます。
list.set(1, "ArrayList-String020202");
printList(list);
5) データ削除
インデクス番号を指定して削除
list.remove(1);
printList(list);
値を探して削除
list.remove(list.get(2));
printList(list);
全ての要素を削除
list.clear();
printList(list);
3. LinkedList
1) リンクドリスト(LinkedList)とは?
LinkedListはデータの格納を配列ではなく**'ノード(Node)'を使い実装したデータ構造で、ノードとノードが相互繋がっているような形でデータを格納します。
※ ノード(Node)とは?
以前のノードの参照値と次のノードの参照値、格納するデータを込めているオブジェクトを言います。
※ 長所
- データの入力・削除が速い
※ 短所
- データの検索に時間がかかる
※ 主に使われているところ
- データのアクセス・検索より入力と削除が多い場合使います。
※ データCRUDはArrayListと共通のメソッドを使いますので省略。
4. Vector
1) ベクター(Vector)とは?
VectorはArrayListのように長さが変わる配列のようなデータ構造です。
性能自体がArrayListの方がよいため、Vectorはあまり使われておりません。
ArrayListとの差は**Vectorの場合Thread-safeし、ArrayListはそうではないため、コードをThread-safeに実装する必要がある場合は使いますが、
現在、ArrayList生成時に synchronizedList()を引数として生成すると
ArrayListでもThread-safeなArrayListが生成できるため、使う理由はあまりないが、レガシーコードに使っている可能背があるため知っておくだけで良いかと思います。
// ※ 例示 :
ArrayList arrayList = new ArrayList<>(Collections.synchronizedList(list));
※ データCRUDはArrayListと共通のメソッドを使いますので省略。
※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_11_List.java
※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/83?category=1068655