Java集合:關于 HashSet 的內容盤點

哈希表存放的是哈希值, HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。

本篇內容包括:HashSet 概述、HashSet 與 HashMap 的關系以及HashSet 的使用


文章目錄

    • 一、HashSet 概述
    • 二、HashSet 與 HashMap
    • 三、HashSet 的使用
        • 1、構造方法
        • 2、常用方法


一、HashSet 概述

哈希表存放的是哈希值, HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。元素的哈希值是通過元素的 hashcode 方法來獲取的, HashSet 首先判斷兩個元素的哈希值,如果哈希值一樣,接著會比較 equals 方法 如果 equls 結果為 true , HashSet 就視為同一個元素。如果 equals 為 false 就不是同一個元素。哈希值相同 equals 為 false 的元素是怎么存儲呢,就是在同樣的哈希值下順延(可以認為哈希值相同的元素放在一個哈希桶中)。也就是哈希一樣的存一列。

HashSet 通過 hashCode 值來確定元素在內存中的位置。一個 hashCode 位置上可以存放多個元素。

HashSet 的底層源碼特別少,主要是因為 HashSet 的方法基本都是借助 HashMap 的方法來實現的。
HashSet 存儲的元素對應 HashMap 的 key,因為 HashMap 不能存儲重復的 key,所以 HashSet 不能存放重復元素;由于 HashMap 的 key 是基于 hashCode 存儲對象的,所以 HashSet 中存放的對象也是無序的;HashSet 也沒有提供 get 方法,可以通過 Iterator 迭代器獲取數據。


二、HashSet 與 HashMap

HashSet 是基于 HashMap 實現的,區別就在于在 HashMap 中輸入一個鍵值對,而在 HashSet 中只輸入一個值。

Java代碼:

private transient HashMap map;// Constructor - 1
// All the constructors are internally creating HashMap Object.
public HashSet()
{// Creating internally backing HashMap objectmap = new HashMap();
}// Constructor - 2
public HashSet(int initialCapacity)
{// Creating internally backing HashMap objectmap = new HashMap(initialCapacity);
}// Dummy value to associate with an Object in Map
private static final Object PRESENT = new Object();

而 HashSet 類的 add 方法的實現是這樣子的,很明顯可以看到是調用了 HashMap 里的 put() 方法。而里面的 present 則是常量,就是沒用的。

public boolean add(E e) 
{ return map.put(e, PRESENT) == null; 
}

三、HashSet 的使用

1、構造方法

HashSet 提供了五種方式的構造器,其中 4 種是 public 修飾的:

方法名方法說明方法名方法說明
public HashSet()無參構造方法,完成 map 的創建;public HashSet(int initialCapacity)指定初始化大小
public HashSet(int initialCapacity, float loadFactor)指定初始化大小,和負載因子public HashSet(Collection)定集合轉化為 HashSet, 完成 map 的創建
HashSet(int initialCapacity, float loadFactor, boolean dummy)指定初始化大小和負載因子,dummy 無實際意義

2、常用方法

方法名方法說明方法名方法說明
boolean add(E e)添加一個元素,如果該元素已經存在,則返回true,如果不存在,則返回falseboolean remove(Object o)刪除指定的元素,刪除成功返回true
Iterator<E> iterator()獲取hashSet的迭代器int size()獲得大小

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535529.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql備份腳本

#!/bin/bash #保留備份個數&#xff0c;會刪除時間較早的.dump備份 number3 #設置備份保存路徑&#xff0c;yourpath替換成自己的備份保存路徑 backup_diryourpath #日期格式 dddate %Y%m%d #備份工具 toolmysqldump #數據庫用戶名 usernameroot #數據庫密碼&#xff0c;由于密…

Java集合:關于 TreeSet 的內容盤點

TreeSet() 是使用二叉樹的原理對新 add() 的對象按照指定的順序排序&#xff08;升序、降序&#xff09;&#xff0c;每增加一個對象都會進行排序&#xff0c;將對象插入的二叉樹指定的位置&#xff1b; ~ 本篇內容包括&#xff1a;TreeSet 概述、TreeSet 的使用以及其他知識點…

python求素數

口求100內的素數 -個數能被從2開始到自己的平發根的正整數整數整除,就是合數 import math n100 for X in range(2, n): for i in range(2, math.ceil(math.sqrt(x))): if x %i 0: break else: print(x)口求100內的素數 合數一定可以分解為幾個質數的乘積 import math n100 pri…

svn鉤子腳本

REP0S"$1" REV"$2"export LANGen_US.UTF-8 LOGPATH"/app/log" [ !-d ${LOGPATH}] && mkdir $[LOGPATH) -p #update content from svn↓14 SVN/usr/bin/svn↓ SVN update --username test --password test /data/ if[ $? -eq ] then /us…

shell判斷字符串是否為數字

#1.組合語法判斷1: [ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g"] &&\echo”兩個參數都必須為數字”&& exit 1#2.組合語法判斷2:[ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g&…

MySQL:DQL 數據查詢語句盤點

本篇內容包括&#xff1a;DQL 的簡介、SELECT 語句、WHERE 條件語句、JOIN 連接查詢(多表查詢)和分組、過濾、排序、分頁、子查詢的使用。 一、DQL 簡介 DQL&#xff08;Data QueryLanguage&#xff09;語句&#xff0c;即數據查詢語句 常用的語句關鍵字有&#xff1a;SELECT…

MySQL:DML 數據操作語句盤點

本篇內容包括&#xff1a;DML 的簡介、INSERT 命令、UPDATE 命令、DELETE 命令以及 TRUNCATE 命令的使用。 一、DML 簡介 DML&#xff08;Data Manipulation Language&#xff09;語句&#xff0c;即數據操作語句&#xff0c;用于操作數據庫對象中所包含的數據。 常用關鍵字包…

MySQL:DDL 數據定義語句盤點

本篇內容包括&#xff1a;DDL 的簡介、SHOW 查看語句、CREATE 創建語句、ALTER 修改語句以及 DROP 刪除語句的使用。 一、DDL 簡介 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;即數據定義語句&#xff0c;功能就是定義數據庫DATabase、表table、索引ind…

MySQL:DCL 數據控制語句盤點

本篇內容包括:DCL 簡介、GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT、LOCK命令的使用。 一、DCL 簡介 DCL&#xff08;Data Control Language&#xff09;語句&#xff0c;即數據控制語句&#xff0c;用于設置或更改數據庫用戶或角色權限的語句 常用關鍵字包括&#xff1a;…

oracle遷移父子數據

現有需求如下&#xff0c;業務組織單元表中id字段數據在另外一個系統全部重復&#xff0c;但需要將此業務單元組織導入另一系統 業務組織單元表Isc_Specialorg_Unit 表中存在ID字段為子節點數據&#xff0c;parent_id為父節點數據&#xff0c;orgpath為組織路徑 現在做如下操…

批量更新數據庫數據

"update isc22.isc_user t set t.saphrid "&E1&"where t.id "&B1&";"

oracle控制文件

控制文件是數據庫里面非常重要的一類文件,它記錄了當前實例連接的數據庫的結構和行為&#xff0c;并維護數據庫的一致性。 初始化參數文件中描述其位置&#xff0c;很小的:二進制文件,一般不要超過100mmount讀open一直在用 控制文件只能連接一個database丟失要恢復 …

oracle表空間

概念 表空間和數據文件 ●表空間是邏輯存儲概念&#xff0c;一個表空間是一個或多個數據文件的邏輯集合 ●存儲對象(表、索引)邏輯的存儲在表空間上&#xff0c;而存儲對象的數據物理的存放在數據文件上 ●數據庫至少需要一個叫做system的表空間&#xff0c;也就是系統表空間 ●…

oracle日志

日志分類 redo log files聯機日志或重做日志 archived log files歸檔日志 1184198alert log files 告警日志 trace files user_ _dump_ _dest 用戶信息日志如跟蹤會話日志 background dump_ dest進程日志還有其他一-些不常用的日志 v$database的log_mode 數據庫歸檔模式…

MySQL:分庫分表知識點盤點

本篇內容包括&#xff1a;數據庫瓶頸、分庫分表以及分庫分表相關問題 一、數據庫瓶頸 不管是IO瓶頸&#xff0c;還是CPU瓶頸&#xff0c;最終都會導致數據庫的活躍連接數增加&#xff0c;進而逼近甚至達到數據庫可承載活躍連接數的閾值。在業務Service來看就是&#xff0c;可用…

oracle的sga

sga SGA的管理 ■有三種方式&#xff1a; ●8i:SGA的總大小由所有內存組件大小之和決定&#xff0c;不能直接定義SCA大小。對內部組件大小的修改必須在數據庫重起 后 才能生為&#xff0c;所以叫做SGA的靜態管理。 ●9i&#xff…

MySQL:日志知識點盤點

本篇內容包括&#xff1a;binlog&#xff08;二進制日志&#xff09;、redo log 以及 undo log 一、binlog&#xff08;二進制日志&#xff09; binlog 用于記錄數據庫執行的寫入性操作(不包括查詢)信息&#xff0c;以二進制的形式保存在磁盤中。binlog是mysql的邏輯日志&…

ROWNUM的使用

一個偽列看起來像是一個表中的列&#xff0c;但實際上并不保存在表中。你可以查詢&#xff0c; 但是不能插入&#xff0c;修改和刪除其中的值。一個偽列也類似于一個沒有參數的函 數。但是在典型情況下&#xff0c;在結果集中可以為每一行返回相同的值&#xff0c;而偽列通 常為…

MySQL:主從相關知識點盤點

本篇內容包括&#xff1a;MySQL 主從復制簡介、主從復制的原理以及主從搭建 一、MySQL 主從復制簡介 在實際的生產中&#xff0c;為了解決Mysql的單點故障已經提高MySQL的整體服務性能&#xff0c;一般都會采用**「主從復制」**。 比如&#xff1a;在復雜的業務系統中&#x…

oracle導出expdp

expdp/impdp 是 oracle 10g 版本后推出的服務器端工具--數據泵&#xff0c;作用是為了將數據庫中的邏輯對象&#xff0c;比如表、用戶、全庫、表空間進 行導入&#xff0c;導出 命令解析 ATTACH ATTACH [[schema_name.]job_name] schema_name 表示用戶名,job_name 表示導出的作…