Java LinkedListの使い方のサンプル

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

目次

仕組み LinkedListクラスとは
  Listインターフェースとは
取得する 要素の位置を指定して要素を取得する (getメソッド)
  要素をすべて取得する(拡張for文)
  要素数を取得する (sizeメソッド)
  要素を指定して要素の位置を取得する (indexOfメソッド)
  指定の要素があるかを返す (containsメソッド)
  中身が空かを返す (isEmptyメソッド)
  要素を順番に処理する(forEachメソッド)
追加する 要素を追加する (addメソッド)
更新する 要素の位置を指定して要素を置き換える (setメソッド)
削除する 要素の位置を指定して要素を削除する (removeメソッド)
  すべての要素を削除する (clearメソッド)
連結する リストを連結する (addAllメソッド)
使用する メソッドの引数と戻り値がリストの場合

LinkedListクラスとは

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

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

  • 1つの変数で同じ型の複数の値を保持できます。
    →各項目を要素(element)といいます。
    →StringやIntegerなどのオブジェクトの参照を保持します。intなどの基本型は使用できません。
  • 要素がそれぞれリンクする二重リンクリストの構造です。(上記図の赤矢印)
    →リストの途中への挿入や削除はリンクを付け替えるだけのため速いです。
    →読み込みは先頭または末尾から検索するので、リストの先頭または末尾へのアクセスは速く中央は遅いです。
    →値の重複は可能です。
    →上記図の[0]、[1]、[2]、[3]はインデックスです。
    →インデックスの先頭は0から始まります。
  • スレッドセーフではありません。
  • バージョン1.2で導入されました。
  • 以下はOracleのJava8 API仕様のLinkedListクラスのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/LinkedList.html

Listインターフェースとは

public interface List<E> extends Collection<E>

LinkedListクラスはListインターフェースを実装しています。
以下はLinkedListクラスの定義です。implementsが実装している箇所です。

public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable
  • LinkedListクラスをインスタンス化する時、LinkedListクラス独自のメソッドを使用しない限り、Listインターフェイス型の変数に代入することが多いです
  • LinkedListクラスは、Listインターフェースを実装しているので、Listインターフェイスにあるメソッドを使用できます。
  • 以下はOracleのJava8 API仕様のListインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

要素の位置を指定して要素を取得する (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> colors = new LinkedList<>();
		colors.add("赤");
		colors.add("黄");
		colors.add("青");
		
		colors.remove(0);
		System.out.println(colors); //[黄, 青]
	}
 }

13行目は、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メソッドでリストを連結しています。

メソッドの引数/戻り値がリストの場合

メソッドの引数と戻り値がリストの場合のサンプルです。

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("青");
        
        List<String> b = getColor(color);
    }
    
    private static List<String> getColor(List<String> c1) {

    	for (String a : c1) {
        	System.out.println(a);//赤 黄 青
        }
        return c1;
    }
}

12行目は、呼び出し元のメソッドです。引数(実引数)にリストを指定しています。戻り値もリストです。
15行目は、定義されたメソッドです。引数(仮引数)にリストがあります。戻り値もリストです。
・「getColor(List<String> c1)」のList<String> c1が引数の型と変数です。
・「private static List<String>」のList<String>が戻り値の型です。

呼び出し元のメソッドの引数の変数名(12行目のcolor)と定義されたメソッドの引数の変数名((15行目のc1)は異なっていても使用できます。

関連の記事

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

△上に戻る