JavaのLinkedListクラスの使い方のサンプルです。
目次
LinkedListクラスとは
List<String> color = new LinkedList<>(); color.add("赤"); color.add("青"); |
1つの変数で複数の値を保持できます。
上記はLinkedListクラスをインスタンス化してListインターフェイス型の変数に代入しています。
この変数colorは複数の値(赤と青)を持てるようになります。
<>はジェネリクスです。変数colorの各値はStringのみセット可能です。
LinkedListの特徴
LinkedListの変数のイメージ
要素
各項目を要素(element)といいます。
1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
要素がそれぞれリンクする構造です。二重リンク・リストと呼ばれます。
要素へのアクセス
先頭または末尾から検索するため、リストの先頭または末尾へのアクセスは速く中央は遅いです。
例:要素が200あるうちのget(100)などインデックスを指定して値を取得する場合、先頭または末尾から検索していきます。
要素の追加と削除
サイズをあとから変更できます。(配列は不可です)
リンクを付け替えるだけのためArrayListより速いです。
その他
要素の順序はあります。二重リンク・リストで管理します。
値の重複は可能です。
スレッドセーフではありません。
以下はOracleのJava8 API仕様のLinkedListクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/LinkedList.html
LinkedListとListの関係
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable |
LinkedListクラスはListインターフェースを実装しています。
使用例
List<String> a = new LinkedList<>(); |
LinkedListクラスをインスタンス化する時、LinkedListクラス独自のメソッドを使用しない限り、Listインターフェイス型の変数に代入することが多いです。
Listインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のListインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html
要素を取得(get、for文、拡張for文、forEach)
getメソッドは、要素の位置を指定して取得します。要素の位置は0から始まります。
for文とforEachはループで要素を順に取得します。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List<String> c1 = new LinkedList<>(Arrays.asList("赤", "黄", "青"));
// get (要素の位置は0から始まる)
System.out.println(c1.get(0)); // 赤
System.out.println(c1.get(1)); // 黄
System.out.println(c1.get(2)); // 青
// for文 (要素の位置は0から始まる,size()で要素数を取得)
for (int i = 0; i < c1.size(); i++) {
System.out.println(c1.get(i)); // 赤 黄 青が出力される
}
// 拡張for文 (for文との違いは加算(i++)の表記なし)
for (String a : c1) {
System.out.println(a); // 赤 黄 青が出力される
}
// forEach (変数a以降はラムダ式)
c1.forEach(a -> System.out.println(a));// 赤 黄 青
// forEach (System.out::printlnはメソッド参照)
c1.forEach(System.out::println);// 赤 黄 青
}
}
25行目の変数a以降はラムダ式です。forEachメソッドは、Java8で導入されました。
28行目のSystem.out::printlnは、メソッド参照です。
要素を検索(containsとindexOfの違い)
public boolean contains(Object o) |
public int indexOf(Object o) |
containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。
indexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。
List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));
// contains
System.out.println(c1.contains("青")); // true (存在する)
System.out.println(c1.contains("白")); // false (存在しない)
// indexOf
System.out.println(c1.indexOf("青")); // 2 (存在する)
System.out.println(c1.indexOf("白")); // -1 (存在しない)
中身が空か、要素数を取得(isEmpty/size)
public boolean isEmpty() |
public int size() |
isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。
List<String> c1 = new LinkedList<>(Arrays.asList("赤","青"));
System.out.println(c1.isEmpty()); //false (中身あり)
System.out.println(c1.size()); //2 (要素数を表示)
c1.clear(); // すべての要素を削除
System.out.println(c1.isEmpty()); //true
System.out.println(c1.size()); //0 (要素数を表示)
要素を追加・更新(add/set)
public boolean add(E e) |
public void add(int index,E element) |
public E set(int index,E element) |
addメソッド(引数1つ)は最後尾に要素を追加します。
addメソッド(引数2つ)は指定の位置に要素を追加します。
setメソッドは要素を置き換えます。
List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));
// add (最後尾に要素を追加)
c1.add("緑");
System.out.println(c1);//[赤, 黄, 青, 緑]
// add (指定の位置に要素を追加)
c1.add(1,"オレンジ");
System.out.println(c1);//[赤, オレンジ, 黄, 青, 緑]
// set (指定の位置の要素を置き換え)
c1.set(1, "シルバー");
System.out.println(c1); //[赤, シルバー, 黄, 青, 緑]
要素の位置は、赤=0、黄=1、青=2です。
要素を削除 (remove/clear)
public E remove(int index) |
public void clear() |
removeメソッドは指定の位置の要素を削除します。削除後のインデックスは前につまります。
clearメソッドはすべての要素を削除します。
List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));
c1.remove(0); // 指定の位置の要素を削除
System.out.println(c1); //[黄, 青]
System.out.println(c1.get(0)); //黄
c1.clear(); // すべての要素を削除
System.out.println(c1); // []
要素の位置は、赤=0、黄=1、青=2です。
リストを連結 (addAll)
public boolean addAll(Collection<? extends E> c) |
addAllメソッドはリストを連結します。
List<String> a1 = new LinkedList<>(Arrays.asList("a","b"));
List<String> b1 = new LinkedList<>(Arrays.asList("あ","い"));
a1.addAll(b1); // リストを連結
System.out.println(a1); // [a, b, あ, い]
System.out.println(b1); // [あ, い]
関連の記事