Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のJShellでSetインターフェースを実装する方法を解説

JShellは、Java 9に搭載されたコマンドラインツールです。式、クラス、インターフェース、メソッドなどの簡単なステートメントを対話形式で実行できるため、Javaのコードを手軽に試すことができます。

SetはJavaにおけるインターフェースの一つで、「重複しない要素(ユニークな要素)」を持つコレクションのための契約を定義しています。object1.equals(object2)trueを返す場合、object1とobject2のうち片方だけがSetの実装に格納されます。

以下のコードスニペットでは、Set.of()メソッドを使用します。Set.of()メソッドが返すコレクションはイミュータブル(不変)であるため、add()メソッドはサポートされていません。要素を追加しようとするとUnsupportedOperationExceptionがスローされます。代わりに、add()メソッドをサポートするHashSetを作成すれば、Setの「重複排除」の性質を確認できます。重複する"Adithya"を挿入しようとした際にfalseが返されることで、追加が失敗したことがわかります。

スニペット1:Set.of()によるイミュータブルなSet

jshell> Set<String> set = Set.of("Adithya", "Chaitanya", "Jai");
set ==> [Jai, Adithya, Chaitanya]

jshell> set.add("Adithya");
|   java.lang.UnsupportedOperationException thrown:

jshell> Set<String> hashSet = new HashSet<>(set);
hashSet ==> [Chaitanya, Jai, Adithya]

jshell> hashSet.add("Adithya");
$8 ==> false

jshell> hashSet
hashSet ==> [Chaitanya, Jai, Adithya]

次のコードスニペットでは、HashSetを実装しています。HashSetでは、要素は挿入順にもソート順にも保存されません。要素の順序は保証されない点に注意してください。

スニペット2:HashSet(順序なし)

jshell> Set<Integer> numbers = new HashSet<>();
numbers ==> []

jshell> numbers.add(12345);
$11 ==> true

jshell> numbers.add(1234);
$12 ==> true

jshell> numbers.add(123);
$13 ==> true

jshell> numbers.add(12);
$14 ==> true

jshell> numbers
numbers ==> [1234, 12345, 123, 12]

次のコードスニペットでは、LinkedHashSetを実装しています。LinkedHashSetでは、要素が挿入順に保存されます。後から追加した要素も、リストの末尾に追加されていくのが確認できます。

スニペット3:LinkedHashSet(挿入順)

jshell> Set<Integer> numbers1 = new LinkedHashSet<>();
numbers1 ==> []

jshell> numbers1.add(12345);
$17 ==> true

jshell> numbers1.add(1234);
$18 ==> true

jshell> numbers1.add(123);
$19 ==> true

jshell> numbers1.add(12);
$20 ==> true

jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12]

jshell> numbers1.add(123456);
$22 ==> true

jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12, 123456]

最後のコードスニペットでは、TreeSetを実装しています。TreeSetでは、要素がソートされた順序で保存されます。数値の場合は昇順に自動的に並び替えられるため、順序付きのコレクションが必要な場面で便利です。

スニペット4:TreeSet(ソート順)

jshell> Set<Integer> numbers2 = new TreeSet<>();
numbers2 ==> []

jshell> numbers2.add(12345);
$25 ==> true

jshell> numbers2.add(1234);
$26 ==> true

jshell> numbers2.add(123);
$27 ==> true

jshell> numbers2.add(12);
$28 ==> true

jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345]

jshell> numbers2.add(123456);
$30 ==> true

jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345, 123456]

このように、JShellを使えば各Set実装クラスの特徴(イミュータブルかどうか、要素の順序など)を対話的に素早く確認できます。用途に応じて、Set.of()(変更不可)、HashSet(順序なし・高速)、LinkedHashSet(挿入順)、TreeSet(ソート順)を使い分けるとよいでしょう。

  1. Java 9でJavaFXを使ってJShellをプログラムから実装する方法

    JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として

  2. Javaの匿名内部クラスでインターフェースを実装する方法をわかりやすく解説

    匿名内部クラス(Anonymous Inner Class)とは、クラス名を持たないクラスのことであり、インスタンス化するその場で直接定義できるのが特徴です。インターフェースの実装を一時的に行いたい場合や、コードを簡潔にまとめたい場合に非常に便利な手法です。匿名内部クラスの基本通常、インターフェースを実装するには、別途クラスを定義して implements キーワードを使用します。しかし匿名内部クラスを使えば、new インターフェース名() { ... } の形式で、インスタンス生成と同時にメソッドの実装を記述できます。実装例次のプログラムでは、TutorialsPoint インターフェースの