
皆さんこんにちは新米です。
今回は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()メソッドを使って見てください。

最後まで読んでくれてありがとう👍
コメント