ホームページ Java &#&チュートリアル Java のセットに関する究極のガイド: この素朴なデータ構造のすべての秘密を明らかにする

Java のセットに関する究極のガイド: この素朴なデータ構造のすべての秘密を明らかにする

Nov 21, 2024 am 12:39 AM

The Ultimate Guide to Sets in Java: Uncovering Every Secret of This Humble Data Structure

Java 愛好家の皆さん!セットが存在する理由を理解しようとしているコーディング初心者でも、もっと学ぶべきことがあるのではないかと考えている百戦錬磨のプログラマーでも、このガイドはあなたのためのものです。ここでは、Java の Set について、その中心的な目的から複雑な仕組みまで、すべてを詳しく掘り下げていきます。バックルを締めてください!


セットとは何ですか?

まず最初に: Set とは何ですか? なぜ気にする必要があるのでしょうか?基本的に、Set は重複した要素を含めることができないコレクションです。言い換えれば、セット内のすべてのアイテムは、カスタム ミーム コレクションと同じくらいユニークです。

セットを使用する理由

あなたがパーティーのゲストリストを作成する任務を負っていると想像してください。誰も招待を 2 回受け取らないようにしたいと考えています (恥ずかしいことなので)。 セットを入力してください 。 Set を使用すると、Java はすべての要素が個別であることを自動的に確認します。 独自性が要件となる状況に最適です。

セットの特徴

  • 重複は許可されません : Set の最も重要な特徴は、要素の重複を決して許可しないことです。すでに存在する要素を追加しますか? Java は丁寧に断ります (仕事が多い上司とは異なります)。

  • 順序なし (一般的に) : セットは、リストとは異なり、挿入順序を気にしません。独自性が維持される限り、彼らは幸せです。

  • Null Handling : 一部のセットでは、要素として null を許可しますが、それは 1 回だけです。


Java のセットの種類

Set が何をするのかがわかったので、Java が提供する Set の種類を見てみましょう:

  1. ハッシュセット
    • 目的 : ほとんどのユースケースで頼りになるセットです。
  • 特性 : HashMap を利用した HashSet は、要素の存在を迅速かつ効率的にチェックします (ほとんどの操作で O(1) 時間の計算量)。

  • メモリ レイアウト : 内部では ハッシュ テーブル を使用し、要素はハッシュ関数に基づいて保存されます。

  • NULL は許可されますか? : はい、ただし 1 つだけです。

  • コード例 :

Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  1. リンクされたハッシュセット
    • 目的 : 広告掲載順序を維持するセットが必要な場合。
  • 特性 : HashSet と LinkedList のハイブリッドです。

  • メモリレイアウト

    : 順序を維持するためにハッシュテーブルと二重リンクリストを使用します。

  • コード例

    :

Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  1. ツリーセット
    • 目的 : 要素をソートの順序で格納するセット。
  • 特性 : NavigableSet を実装し、ストレージに Red-Black Tree を使用します。

  • メモリレイアウト : バランスの取れたツリー構造。

  • コード例 :

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");
System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]
ログイン後にコピー
ログイン後にコピー
ハッシュセットはどのように機能するのでしょうか?

ボンネットを開けて中を覗いてみましょう。 HashSet はストレージに

ハッシュ テーブル を使用し、各要素にはハッシュ コードに基づいてバケットが割り当てられます。要素を追加すると、次のことが起こります:

  1. ハッシュ コード計算 : Java は hashCode() メソッドを呼び出して要素のハッシュ コードを取得します。

  2. バケットの決定 : ハッシュ コードはバケット (配列インデックス) にマッピングされます。

  3. 衝突処理 : バケットがすでに占有されている (衝突) 場合、Java は チェーン (新しい Java バージョンではリンク リストまたはバランス ツリー) を使用して、バケット内の複数の要素を管理します。同じバケットです。
    HashSet 構造の図:

Set<Integer> treeSet = new TreeSet<>();
treeSet.add(42);
treeSet.add(10);
treeSet.add(25);
System.out.println(treeSet); // Output: [10, 25, 42]
ログイン後にコピー

セットを操作するためのテクニック

正しいコツを知っていれば、セットの操作は楽しくなります:

  1. 2 つのセットの和集合 :
[0] -> [Apple] -> [Banana] 
[1] -> [Grapes]
[2] -> [null]
[3] -> [Orange]
...
ログイン後にコピー
  1. 2 つのセットの交差 :
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5));
set1.addAll(set2);
System.out.println(set1); // Output: [1, 2, 3, 4, 5]
ログイン後にコピー
  1. セット間の違い :
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5));
set1.retainAll(set2);
System.out.println(set1); // Output: [3]
ログイン後にコピー

セットをいつ使用するか?

一般的なシナリオ :

  • アプリケーション内で

    一意のユーザー名を確保します。

  • Web クローラーで

    アクセスしたページ を追跡します。

  • アイテムの固有のコレクション (選挙における固有の投票者など) を維持します。
    考慮すべき危険信号 :

  • インデックスによって要素にアクセスする必要がある場合、

    Set は友達ではありません。代わりにリストを使用してください。

  • 重複が必要な場合 (項目の出現数を数えるなど)、リストまたはマップを検討してください。

Set インターフェイスのメソッド

最も一般的に使用されるメソッドのチートシートを次に示します:

  • add(E e) : 要素がまだ存在しない場合は追加します。

  • remove(Object o) : 指定された要素が存在する場合はそれを削除します。

  • contains(Object o) : 要素が Set 内にあるかどうかを確認します。

  • size() : 要素の数を返します。

  • clear() : すべての要素を削除します。

  • isEmpty() : Set が空かどうかを確認します。

  • iterator() : 要素の反復子を返します。


高度なテクニックとコツ

  1. セット内のカスタム オブジェクト : Set が期待どおりに動作するように、カスタム オブジェクトのequals() と hashCode() を常にオーバーライドしてください。
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  1. 同時セット :
    スレッドセーフな操作には ConcurrentHashMap.newKeySet() または CopyOnWriteArraySet を使用します。

  2. 不変セット :
    読み取り専用 Set を作成するには、Collections.unmodifiableSet() または Set.of() を使用します。

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");
System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]
ログイン後にコピー
ログイン後にコピー

パフォーマンスに関する考慮事項

HashSet は、要素の追加、削除、チェックの O(1) パフォーマンスにより、ほとんどのタスクに最適です。 TreeSet はコストが高くなります (O(log n)) が、自然な順序付けという利点が追加されます。 LinkedHashSet は、わずかなオーバーヘッドで予測可能な反復順序を提供します。

セットに適した問題を特定する

問題の種類を認識する :

  • 一意性チェック (文書内の一意の単語の検索など)。

  • 操作の設定 (例: ユーザー間の共通の友人の検索)。

  • 重複のない高速検索 (例: 一定時間内の要素の存在のチェック)。

最終的な考え

セットはリストほど魅力的ではなく、マップほど謎めいていないかもしれませんが、一意のコレクションを効率的に維持する上で重要な役割を果たします。これらは、データをクリーンで明確に保ち、​​予期せぬ結果につながる可能性のある厄介な重複からユーザーを保護する縁の下の力持ちです。アルゴリズムを最適化している場合でも、データの整合性を確保している場合でも、単に に適した構造を選択しようとしている場合でも、動作するだけです。セットを徹底的に理解することで、より強力な開発者になれます。強力なセットの真の可能性を解き放ったと確信して、自信を持ってコーディングに取り組んでください!


これで終わりです!

以上がJava のセットに関する究極のガイド: この素朴なデータ構造のすべての秘密を明らかにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

See all articles