Java LinkedListの使い方のサンプル

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

目次

仕組み LinkedListクラスとは
  LinkedListクラスとListインターフェースの関係
取得する 要素の位置を指定して要素を取得する (getメソッド)
  要素をすべて取得する(拡張for文)
  要素数を取得する (sizeメソッド)
  要素を指定して要素の位置を取得する (indexOfメソッド)
  指定の要素があるかを返す (containsメソッド)
  中身が空かを返す (isEmptyメソッド)
  要素を順番に処理する(forEachメソッド)
追加する 要素を追加する (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の変数の図

  • 1つの変数で同じ型の複数の値を保持できます。
    →各項目を要素(element)といいます。
    →値は、StringやIntegerなどの参照型です。intなどの基本型は使用できません。
  • 要素がそれぞれリンクする構造です。二重リンク・リストと呼ばれます。(上記図の赤矢印)
  • サイズをあとから変更できます。(配列は不可です)

 

LinkedListの特徴

項目 説明
要素へのアクセス 先頭または末尾から検索するため、リストの先頭または末尾へのアクセスは速く中央は遅いです。
例:要素が200あるうちのget(100)などインデックスを指定して値を取得する場合、先頭または末尾から検索していきます。
要素の挿入や削除 リンクを付け替えるだけのため速いです。
要素の順序 要素の順序はあります。二重リンク・リストで管理します。
値の重複 値の重複は可能です。
スレッドセーフ スレッドセーフではありません。

LinkedListクラスとListインターフェースの関係

LinkedListクラスはListインターフェースを実装しています。

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable

上記はLinkedListクラスの定義です。implementsが実装している箇所です。
LinkedListクラスは、Listインターフェースを実装しているので、Listインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のListインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

 

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

LinkedListクラスをインスタンス化する時、LinkedListクラス独自のメソッドを使用しない限り、Listインターフェイス型の変数に代入することが多いです。(上記例)

 

要素の位置を指定して要素を取得する (getメソッド)

public E get(int index)

要素の位置を指定して要素を取得するサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		System.out.println(colors.get(1)); //黄
	}
 }

13行目は、getメソッドで要素の位置を指定して要素を取得しています。
要素の位置は、赤=0、黄=1、青=2です。
先頭または末尾から検索しています。

要素をすべて取得する(拡張for文)

要素をすべて取得する拡張for文のサンプルです。

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

public class Test1 {
	public static void main(String[] args) {
		
		List<String> color = new LinkedList<>();
		color.add("赤");
		color.add("黄");
		color.add("青");
		
        for (String a : color) {
            System.out.println(a);//赤 黄 青
        }
	}
 }

13行目は、for文ですべての要素を取得しています。
加算をしていないfor文で拡張for文と呼ばれます。

要素数を取得する (sizeメソッド)

public int size()

要素数を取得するサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		System.out.println(colors.size()); //3
	}
 }

13行目は、sizeメソッドで要素数を取得しています。

要素を指定して要素の位置を取得する (indexOfメソッド)

public int indexOf(Object o)

要素を指定して要素の位置を取得するサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		System.out.println(colors.indexOf("黄")); //1
	}
 }

13行目は、indexOfメソッドで要素を指定して要素の位置を取得しています。
要素の位置は、赤=0、黄=1、青=2です。

指定の要素があるかを返す (containsメソッド)

public boolean contains(Object o)

指定の要素があるかを返すサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		System.out.println(colors.contains("青")); //true
	}
 }

13行目は、containsメソッドで指定の要素があるかを取得しています。
ある場合trueです。

中身が空かを返す (isEmptyメソッド)

public boolean isEmpty()

中身が空かを返すサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		System.out.println(colors.isEmpty()); //false
		
		colors.clear();
		System.out.println(colors.isEmpty()); //true
	}
 }

12行目は、isEmptyメソッドで空か取得しています。中身があるのでfalseです。
14行目は、clearメソッドですべての要素を削除しています。
15行目は、中身が空なのでtrueです。

要素を順番に処理する(forEachメソッド)

public void forEach(Consumer<? super E> action)

要素を順番に処理するサンプルです。forEachメソッドは、Java8で導入されました。

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

public class Test1 {
    public static void main(String[] args) {
        
        List<String> colors = new LinkedList<>();
        colors.add("赤");
        colors.add("黄");
        colors.add("青");
        
        colors.forEach(a -> System.out.println(a));//赤 黄 青
        colors.forEach(System.out::println);//赤 黄 青
    }
 }

13行目は、forEachメソッドでリストの各値を取得しています。変数a以降はラムダ式です。
Java ラムダ式のサンプル
14行目のSystem.out::printlnは、メソッド参照です。13行目と同じ意味です。

以下は、OracleのIterableインタフェースのforEachメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-

要素を追加する (addメソッド)

public boolean add(E e)
public void add(int index,E element)

要素を追加するサンプルです。

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

public class Test1 {
    public static void main(String[] args) {
        
        List<String> colors = new LinkedList<>();
        
        colors.add("赤");
        colors.add("黄");
        colors.add("青");
        
        for (String a : colors) {
            System.out.println(a);//赤 黄 青
        }
        
        colors.add(2,"オレンジ");
        
        for (String a : colors) {
            System.out.println(a);//赤 黄 オレンジ 青
        }
    }
 }

8行目は、LinkedListクラスをインスタンス化してListインターフェイス型の変数に代入しています。
→ジェネリクス<>でオブジェクトの中身はStringであると宣言しています。
10-12行目は、addメソッドで要素を追加しています。
18行目は、位置を指定して要素を追加しています。

要素の位置を指定して要素を置き換える (setメソッド)

public E set(int index,E element)

要素の位置を指定して要素を置き換えるサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		colors.set(1, "紫");
		System.out.println(colors); //[赤, 紫, 青]
	}
 }

13行目は、setメソッドで要素の位置を指定して要素を置き換えています。
要素の位置は、赤=0、黄=1、青=2です。

要素の位置を指定して要素を削除する (removeメソッド)

public E remove(int index)

要素の位置を指定して要素を削除するサンプルです。

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

public class Test1 {
	public static void main(String[] args) {
		List<String> color = new LinkedList<>();
		color.add("赤");
		color.add("黄");
		color.add("青");
		
		color.remove(0);
		System.out.println(color); //[黄, 青]
		System.out.println(color.get(0)); // 黄
		System.out.println(color.get(1)); // 青
	}
 }

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

すべての要素を削除する (clearメソッド)

public void clear()

すべての要素を削除するサンプルです。

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

public class Test1 {
	public static void main(String[] args) {

		List<String> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		colors.clear();
		System.out.println(colors); //[]
	}
 }

13行目は、clearメソッドですべての要素を削除しています。

リストを連結する (addAllメソッド)

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

リストを連結するサンプルです。

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

public class Test1 {
    public static void main(String[] args) {
        
        List<String> a1 = new LinkedList<>();
        a1.add("a");
        a1.add("b");
        
        List<String> b1 = new LinkedList<>();
        b1.add("あ");
        b1.add("い");
        
        a1.addAll(b1);
        
        for (String a : a1) {
            System.out.println(a);//a b あ い
        }
    }
 }

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

関連の記事

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

△上に戻る