Java LinkedListの使い方のサンプル

JavaのLinkedListクラスの使い方のサンプルです。

目次

仕組み LinkedListクラスとは
  LinkedListクラスとListインターフェースの関係
取得 要素を取得(get、for文、拡張for文、forEach)
  要素を検索(containsとindexOfの違い)
  中身が空か、要素数を取得(isEmpty/size)
追加・更新 要素を追加・更新(add/set)
削除 要素を削除 (remove/clear)
連結 リストを連結する (addAll)

LinkedListクラスとは

LinkedListクラスの定義

public class LinkedList<E>
extends AbstractSequentialList<E> // 継承するクラス
implements List<E>, Deque<E>, Cloneable, Serializable // 実装するインターフェース

使用例

List<String> a = new LinkedList<>();

上記はLinkedListクラスをインスタンス化してListインターフェイス型の変数に代入しています。
この変数aは複数の値を持てるようになります。
<>はジェネリクスです。変数aの各値はStringであると宣言しています。

LinkedListの仕様

項目 説明
LinkedListの
変数のイメージ
LinkedList 1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
要素がそれぞれリンクする構造です。二重リンク・リストと呼ばれます。
サイズをあとから変更できます。(配列は不可です)
各項目を要素(element)といいます。
要素へのアクセス 先頭または末尾から検索するため、リストの先頭または末尾へのアクセスは速く中央は遅いです。
例:要素が200あるうちのget(100)などインデックスを指定して値を取得する場合、先頭または末尾から検索していきます。
要素の挿入や削除 リンクを付け替えるだけのため速いです。
要素の順序 要素の順序はあります。二重リンク・リストで管理します。
値の重複 値の重複は可能です。
スレッドセーフ スレッドセーフではありません。
導入時期 バージョン1.2で導入されました。

以下は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)

public E get(int index)

getメソッドは、要素の位置を指定して取得します。要素の位置は0から始まります。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));

		System.out.println(c1.get(1)); // 黄
		
        for (int i = 0; i < c1.size(); i++) {
            System.out.println(c1.get(i)); // 赤 黄 青が出力される
        }
        for (String a : c1) {
            System.out.println(a); // 赤 黄 青が出力される
        }
        c1.forEach(a -> System.out.println(a));//赤 黄 青
        c1.forEach(System.out::println);//赤 黄 青
	}
 }

10行目は、getメソッドで要素の位置を指定して要素を取得しています。
要素の位置は、赤=0、黄=1、青=2です。
12行目は、for文ですべての要素を取得しています。
15行目は、加算(i++)の表記がないfor文で拡張for文と呼ばれます。すべての要素を取得しています。
18行目は、forEachメソッドでリストの各値を取得しています。変数a以降はラムダ式です。
19行目のSystem.out::printlnは、メソッド参照です。
forEachメソッドは、Java8で導入されました。

要素を検索(containsとindexOfの違い)

public boolean contains(Object o)
public int indexOf(Object o)

containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。
indexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));
		
		System.out.println(c1.contains("青")); // true
		System.out.println(c1.contains("白")); // false		
		System.out.println(c1.indexOf("青"));  // 2
		System.out.println(c1.indexOf("白")); // -1	
	}
 }

8行目は、リストです。
10,11行目は、containsメソッドで指定の値を検索しています。
12,13行目は、indexOfメソッドで指定の値を検索しています。要素の位置は、赤=0、黄=1、青=2です。

中身が空か、要素数を取得(isEmpty/size)

public boolean isEmpty()
public int size()

isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		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
	}
 }

10行目は、isEmptyメソッドで空か真偽値を取得しています。中身があるのでfalseです。
11行目は、sizeメソッドで要素数を表示しています。
12行目は、clearメソッドですべての要素を削除しています。
13行目は、中身が空なのでtrueです。

要素を追加・更新(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メソッドは要素を置き換えます。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
    public static void main(String[] args) {
    	List<String> c1 = new LinkedList<>(Arrays.asList("赤","黄","青"));
    	
        System.out.println(c1);//[赤, 黄, 青]
        c1.add("緑");
        System.out.println(c1);//[赤, 黄, 青, 緑]
        c1.add(1,"オレンジ");
        System.out.println(c1);//[赤, オレンジ, 黄, 青, 緑]
        c1.set(1, "シルバー");
		System.out.println(c1); //[赤, シルバー, 黄, 青, 緑]
    }
 }

11行目は、addメソッドで要素を末尾に追加しています。
13行目は、位置を指定して要素を追加しています。最初の位置は0から始まります。
15行目は、setメソッドで要素の位置を指定して要素を置き換えています。
要素の位置は、赤=0、黄=1、青=2です。

要素を削除 (remove/clear)

public E remove(int index)
public void clear()

removeメソッドは指定の位置の要素を削除します。
clearメソッドはすべての要素を削除します。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		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); // []
	}
}

10行目は、removeメソッドでインデックスを指定して要素を削除しています。
要素の位置は、赤=0、黄=1、青=2です。
削除後のインデックス値は前につまります。
13行目は、clearメソッドですべての要素を削除しています。

リストを連結する (addAll)

public boolean addAll(Collection<? extends E> c)

addAllメソッドはリストを連結します。

package test1;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
    public static void main(String[] args) {
        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); // [あ, い]
    }
 }

11行目は、addAllメソッドでリストを連結しています。

関連の記事

Java ArrayListとListの使い方のサンプル
Java 配列からリスト・セットを作成(addAll/asList)
Java リスト・セットから配列を作成(toArray)

△上に戻る