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

JavaにおけるSet/HashSetの内部動作を徹底解説

SetとHashSetの基本的な仕組み

Setは、重複しない一意の値のみを格納するためのデータ構造です。つまり、同じ値を何度追加しようとしても、Set内には1度だけ保存されます。JavaでHashSetを生成すると、その内部では実際にHashMapが実装されています。HashSetへ要素を追加する際には「add」メソッドを使用しますが、このメソッドは内部的にHashMapの「put」メソッドを呼び出します。この仕組みによって、SetはHashMapの力を借りて一意の値だけを保持できるのです。

HashMapとの密接な関係

HashMapは、一意なキーと値のペアを管理するコレクションであり、「put」メソッドを使ってキーと値を挿入します。「put」メソッドを呼び出すと、指定したキーに既にマッピングが存在する場合はそのキーに関連付けられていた以前の値が返され、マッピングが存在しない場合はnullが返されます。HashSetはこの戻り値を利用することで、要素がすでに存在しているかどうかを判定し、重複した値の追加を自動的に防いでいます。

LinkedHashSetとの継承関係

LinkedHashSetはHashSetクラスを継承したクラスです。具体的には、LinkedHashSetは「super」キーワードを使ってHashSetクラスのコンストラクタを呼び出します。これにより、LinkedHashSetはHashSetの機能を受け継ぎながら、要素の挿入順序を保持するという独自の特徴を持っています。

サンプルコード

import java.util.HashSet;
public class Demo{
    public static void main(String args[]){
        HashSet my_hashset = new HashSet();
        boolean my_b1 = my_hashset.add("only");
        boolean my_b2 = my_hashset.add("sample");
        boolean my_b3 = my_hashset.add("sample");
        System.out.println("最初のbooleanの値は " + my_b1);
        System.out.println("2番目のbooleanの値は = "+my_b2);
        System.out.println("3番目のbooleanの値は = "+my_b3);
        System.out.println(my_hashset);
    }
}

実行結果

最初のbooleanの値は true
2番目のbooleanの値は = true
3番目のbooleanの値は = false
[only, sample]

コードの解説

Demoという名前のクラスにはmainメソッドが含まれており、その中でHashSetのインスタンスが定義されています。「add」メソッドを使ってハッシュセットに要素を追加し、その後、それらの要素が画面に表示されます。

ここで注目すべきポイントは、3番目の「add」呼び出しの結果がfalseになっている点です。これは「sample」という文字列がすでにセット内に存在していたため、追加処理が失敗したことを示しています。この動作こそが、HashSetが内部的にHashMapを活用して重複を排除していることの明確な証拠といえるでしょう。

  1. JavaにおけるListとSetの違いを徹底解説

    ListとSetは、どちらもJavaのCollectionフレームワークに属するインターフェースであり、双方ともCollectionインターフェースを継承しています。これらは、複数のオブジェクトをひとつのまとまった単位として格納・管理するために使用されます。JDK 1.2以前のJavaでは、オブジェクトをグループ化するために配列(Array)、Vector、Hashtableなどが利用されていました。JDK 1.2でCollectionフレームワークが導入されて以降、ListやSetといったインターフェースがオブジェクト管理の標準的な手段となっています。本記事では、ListとSetの主な違いを

  2. Pythonの内部動作を解説:インタプリタとメモリ上のオブジェクト配置の仕組み

    本記事では、Pythonの内部動作について詳しく解説し、Pythonインタプリタがさまざまなオブジェクトに対してどのようにメモリ上の領域を割り当てているのかを見ていきます。 Pythonはどのような言語か Pythonは、Javaと同じくオブジェクト指向のプログラミング言語です。インタプリタを使ってコードを実行するため、「インタプリタ型言語」と呼ばれています。Pythonはミニマリズムとモジュール性を重視する設計思想を持っており、コードの可読性を高めながら、処理時間とメモリ使用量(時間計算量・空間計算量)を最小限に抑えることを目指しています。 また、Pythonの標準的な実装は「CPytho