Java of()メソッド 変更不可能なList、Set、Mapの作成




新米太郎
新米太郎

皆さんこんにちは新米です。

今回はof()メソッドについてまとめて見たよ!

of()メソッドとは?

Java9以降からList・Set・Mapの各インタフェースにstaticメソッドとしてof()メソッドが
提供されました。

このof()メソッドは、変更不可能なList・Set・Mapを作成します。

of()メソッドの特徴

・要素を追加、削除、置換する事はできません。それらを行うメソッドを利用すると「UnsapportedOperationException」が発生します。

・セットとリストはnull要素を使用できません。nullを入れると「NullPointerException」が発生します。

・マップはキーと値どちらもnullを入れる事はできません。nullを入れると「NullPointerException」が発生します。

・セットの場合、重複する値は使用できません。重複の場合、「IllegalArgumentException」が発生します。

・マップの場合、重複するキーは使用できません。重複の場合、「IllegalArgumentException」が発生します。


実際にコードを見てみよう。

先ほど紹介した「of()メソッドの特徴」を踏まえて見てみましょう。

 

・要素を追加、削除、置換

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List <Integer> list = List.of(1,2,3);
        //list.add(4); //実行時エラー
        System.out.print(list);
    }
}

実行結果

[1, 2, 3]

6行目のコメントを外すと実行時エラーが起こります。

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:127)
	at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:131)
	at Main.main(Main.java:6)

・セットとリストはnull要素を使用不可

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Set  set = Set.of(1,2,3,null);
        System.out.print(set);
    }
}

5行目で要素にnullを代入してます。

実行結果

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "pe" is null
	at java.base/java.util.ImmutableCollections$SetN.probe(ImmutableCollections.java:843)
	at java.base/java.util.ImmutableCollections$SetN.(ImmutableCollections.java:752)
	at java.base/java.util.Set.of(Set.java:522)
	at Main.main(Main.java:5)

・マップはキーと値どちらもnull使用不可

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map <Integer,String> map = Map.of(1,"A",2,"B",3,null);
        System.out.print(map);
    }
}

5行目で値にnullを代入しています。キー又はキー&値、両方nullの場合でも
実行時エラーが発生します。

実行結果

Exception in thread "main" java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:208)
	at java.base/java.util.ImmutableCollections$MapN.(ImmutableCollections.java:1019)
	at java.base/java.util.Map.of(Map.java:1349)
	at Main.main(Main.java:5)

・セットの場合、重複する値の使用不可

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Set  set = Set.of(1,2,1);
        System.out.print(set);
    }
}

5行目に重複した値をセットしています。

実行結果

Exception in thread "main" java.lang.IllegalArgumentException: duplicate element: 1
	at java.base/java.util.ImmutableCollections$SetN.(ImmutableCollections.java:754)
	at java.base/java.util.Set.of(Set.java:503)
	at Main.main(Main.java:5)

・マップの場合、重複するキーの使用不可

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map <Integer,String> map1 = Map.of(1,"A",2,"B",3,"A");
        System.out.print(map1);
        
        //Map <Integer,String> map2 = Map.of(1,”A”,2,”B”,1,”C”); //キーの重複
        //System.out.print(map2);
        
    }
}

キーの重複はダメですが、値の重複は問題ありません。

実行結果

{1=A, 2=B, 3=A}

8,9行目のコメントを外すと実行時エラーが起こります。

Exception in thread "main" java.lang.IllegalArgumentException: duplicate key: 1
	at java.base/java.util.ImmutableCollections$MapN.(ImmutableCollections.java:1022)
	at java.base/java.util.Map.of(Map.java:1349)
	at Main.main(Main.java:8)

まとめ

いかがだったでしょうか。

変更不可能なList・Set・Mapを作成したい場合はof()メソッドを使って見てください。

新米太郎
新米太郎

最後まで読んでくれてありがとう👍

コメント

タイトルとURLをコピーしました