目次
1. 定義 " > 1. 定義
ホームページ Java &#&チュートリアル Java 改良章 (24)-----HashSet

Java 改良章 (24)-----HashSet

Feb 10, 2017 pm 02:23 PM

原文: http://www.php.cn/

前回のブログ記事 (Java 改善編 (23)-----HashMap) では、HashMap について説明しました。詳細 HashSet の実装プロセスは HashMap に基づいており、最下層は HashMap を使用して要素を保存します。 HashMap に慣れている人であれば、HashSet はとても簡単です!!

1. 定義


public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
ログイン後にコピー

HashSet は AbstractSet クラスを継承し、Set、Cloneable、および Serializable インターフェイスを実装します。その中で、AbstractSet は Set インターフェイスのバックボーン実装を提供するため、このインターフェイスの実装に必要な作業が最小限に抑えられます。 Set インターフェイスは、重複する要素を含まないコレクションであるため、独自の内部順序を維持するため、ランダム アクセスは意味がありません。所属本 基本属性


//基于HashMap实现,底层使用HashMap保存所有元素
private transient HashMap<E,Object> map;

 //定义一个Object对象作为HashMap的value
 private static final Object PRESENT = new Object();
ログイン後にコピー
E



コンストラクター


りー



見えるねコンストラクターから、HashSet のすべての構造が新しい HashMap を構築します。最後のコンストラクターは、パッケージのアクセス許可に対して公開されず、LinkedHashSet を使用する場合にのみ有効になります。

2. メソッド

HashSet は HashMap に基づいているため、HashSet のメソッドの実装プロセスは非常に簡単です。

/**
         * 默认构造函数
         * 初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
         */
        public HashSet() {
            map = new HashMap<>();
        }
        
        /**
         * 构造一个包含指定 collection 中的元素的新 set。
         */
        public HashSet(Collection<? extends E> c) {
            map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
            addAll(c);
        }
        
        /**
         * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
         */
        public HashSet(int initialCapacity, float loadFactor) {
            map = new HashMap<>(initialCapacity, loadFactor);
        }
           
        /**
         * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
         */
        public HashSet(int initialCapacity) {
           map = new HashMap<>(initialCapacity);
        }
           
        /**
         * 在API中我没有看到这个构造函数,今天看源码才发现(原来访问权限为包权限,不对外公开的)
         * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。
         * dummy 为标识 该构造函数主要作用是对LinkedHashSet起到一个支持作用
         */
        HashSet(int initialCapacity, float loadFactor, boolean dummy) {
           map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
ログイン後にコピー

iterator() メソッドは、このセット内の要素を反復する反復子を返します。要素が返される順序は特定ではありません。 HashMap の keySet への基礎的な呼び出しはすべてのキーを返します。これは、HashSet 内のすべての要素が HashMap のキーに格納され、値が使用される PRESENT オブジェクト (静的 Final) であることを反映しています。

public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
ログイン後にコピー

size() は、このセット内の要素の数 (セットの容量) を返します。最下層は HashMap の size メソッドを呼び出し、HashMap コンテナのサイズを返します。

public int size() {
        return map.size();
    }
ログイン後にコピー

isEmpty() は、HashSet() セットが空かどうかを判断し、空の場合は true を返し、そうでない場合は false

を返します。

public boolean isEmpty() {
        return map.isEmpty();
    }
ログイン後にコピー

Contains() は、HashSet() に要素が存在するかどうかを判断し、存在する場合は true を返し、存在しない場合は false を返します。より正確には、true を返すにはこの関係が満たされる必要があります: (o==null ? e==null : o.equals(e))。最下層は containsKey を呼び出して、HashMap のキー値が空かどうかを判断します。

public boolean contains(Object o) {
        return map.containsKey(o);
    }
ログイン後にコピー

add() このセットに指定された要素がまだ含まれていない場合は、指定された要素を追加します。この Set に (e==null ? e2==null : e.equals(e2)) を満たす e2 が含まれていない場合、e2 が Set に追加されます。それ以外の場合は追加されず、false が返されます。最下層は HashMap の put メソッドを使用して key = e、value = PRESENT をキーと値のペアに構築するため、HashMap のキーに e が存在する場合、値は元の値を上書きしますが、キーは変更されません。既存の e 要素が HashSet に追加された場合、新しく追加された要素は HashMap に保存されないため、HashSet 内の要素が繰り返されないという機能が満たされます。

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
ログイン後にコピー

mRemove 指定された要素がこのセットに存在する場合、それが削除されます。最下層は、HashMap の Remove メソッドを使用して、指定された Entry を削除します。

public void clear() {
        map.clear();
    }
ログイン後にコピー

clear从此 set 中移除所有元素。底层调用HashMap的clear方法清除所有的Entry。

public Object clone() {
        try {
            HashSet<E> newSet = (HashSet<E>) super.clone();
            newSet.map = (HashMap<E, Object>) map.clone();
            return newSet;
        } catch (CloneNotSupportedException e) {
            throw new InternalError();
        }
    }
ログイン後にコピー

          clone返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。

          后记:

          由于HashSet底层使用了HashMap实现,使其的实现过程变得非常简单,如果你对HashMap比较了解,那么HashSet简直是小菜一碟。有两个方法对HashMap和HashSet而言是非常重要的,下篇将详细讲解hashcode和equals。

---------------------------------------------------------------------------------------------------------

以上就是java提高篇(二四)-----HashSet的内容,更多相关内容请关注PHP中文网(www.php.cn)!



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles