Java對象的hashcode

在 Java 中,hashcode?和?equals?方法是?Object?類的兩個重要方法,它們在處理對象比較和哈希集合(如?HashMapHashSet)時起著關鍵作用。對于equals大部分Java程序員都不陌生,它通常是比較兩個對象的內容(值)是否相等(==雙等于比較對象的內存地址),如果是Object中的equals方法默認就是比較內存地址(在沒有被重寫的情況下和==一樣)。

hashCode?方法返回對象的哈希值。哈希碼是一個整數值,主要用于在哈希表(如?HashMapHashSet)中快速定位對象。hashcode的值默認由JVM使用隨機數生成的。

使用哈希碼值的目的是為了判斷元素是否存在哈希表中,如果使用equals來查詢效率會很低。如果哈希表中沒有這個對象對應的hashcode值,那么就可以確定這個對象在哈希表中不存在,存入到哈希表中;如果存在相同的hashcode值,就調用equals方法與新的元素進行比較,相同就直接覆蓋,不相同就散列到其他的地址。

  • 默認實現Object?類中的?hashCode?方法基于對象的內存地址生成哈希碼。
  • 重寫原則:當重寫?equals?方法時,通常也需要重寫?hashCode?方法。這是因為在哈希集合中,首先會根據對象的哈希碼值來確定對象所在的桶(bucket),然后再使用?equals?方法來確定桶內的具體位置。如果兩個對象通過?equals?方法比較相等,但它們的?hashCode?方法返回不同的值,那么在哈希集合中這兩個對象可能會被存儲在不同的位置,導致哈希集合無法正確工作。

重寫?hashCode?方法的一般原則是:

  • 如果兩個對象通過?equals?方法比較相等,那么它們的?hashCode?方法必須返回相同的值。
  • 如果兩個對象通過?equals?方法比較不相等,它們的?hashCode?方法返回的值不一定不同,但盡量使不同對象的哈希碼值分散,以提高哈希表的性能。

簡而言之,兩個對象equals相等,那么hashcode一定相等;兩個對象equals不相等,hashcode可有可能相等,這個就稱為哈希沖突。解決哈希沖突通常使用線性探測或者二次探測,這里就不具體展開了。

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}
}

在上述?Person?類的例子中,hashCode?方法使用?Objects.hash?方法根據?name?和?age?字段生成哈希碼,確保了相等的?Person?對象具有相同的哈希碼。這樣在使用哈希集合存儲?Person?對象時,能保證數據的一致性和高效訪問。

需要注意的是,當我們重寫equals() 方法,就一定要重寫hashCode()方法,因為如果我們只重寫equals方法,就有可能導致hashcode不相同,這樣就會導致這個類無法和所有的集合類一起工作。

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

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

相關文章

Ubuntu22.04通過DKMS包安裝Intel WiFi系列適配器(網卡驅動)

下載驅動包 訪問 backport-iwlwifi-dkmshttps://launchpad.net/ubuntu/source/backport-iwlwifi-dkms 網站,找到適用于Ubuntu 22.04的update版本(如backport-iwlwifi-dkms_xxxx_all.deb),下載至本地。 安裝驅動 在下載目錄中執行以…

深度學習--概率

1 基本概率論 1.1 假設我們擲骰子,想知道1而不是看到另一個數字的概率,如果骰子是公司,那么所有6個結果(1..6),都有相同的可能發生,因此,我們可以說1發生的概率為1/6. 然而現實生活中,對于我們從工廠收到的…

kaggle上經典泰坦尼克項目數據分析探索

之前了解在kaggle上這個項目很火,最近想要加強一下python數據分析,所以在kaggle上找到這個項目進行學習探索,下面是將一些學習資料以及過程整理出來。 一、首先我們了解一下項目背景以及如何找到這個項目。 kaggle項目地址: https://www.k…

《深度剖析:鴻蒙系統不同終端設備的UI自適應布局策略》

在萬物互聯的時代,鴻蒙系統以其獨特的分布式理念和強大的技術架構,迅速在智能終端領域嶄露頭角。隨著鴻蒙生態的不斷壯大,越來越多的開發者投身其中,致力于為用戶打造豐富多樣的應用體驗。然而,如何讓應用在不同終端設…

計算機網絡的軟件、硬件和組成

1.計算機網絡的組成 計算機網絡是一個十分復雜的系統,在邏輯上可以分為完成數據通信的通信子網和進行數據處理的資源子網兩個部分。 通信子網 通信子網提供網絡通信的功能,可以完成網絡主機之間的數據傳輸、交換、通信控制和信號變換等通信…

告別低效人工統計!自動計算計劃進度

實時監控任務進度一直是項目管理中的一項巨大挑戰。 人工統計方式不僅耗時耗力,而且往往由于信息傳遞的延遲和人為誤差,導致無法實時獲得準確的項目進展信息。 這種不準確性可能掩蓋潛在的風險點,從而影響項目的整體進度和成果。 Ganttable …

樓宇自控系統的結構密碼:總線與分布式結構方式的差異與應用

在現代建筑中,為了實現高效、智能的管理,樓宇自控系統變得越來越重要。它就像建筑的 智能管家,可自動控制照明、空調、通風等各種機電設備,讓建筑運行更順暢,還能節省能源成本。而在樓宇自控系統里,有兩種關…

OpenWrt開發第4篇:設置開發板的IP-基于Raspberry Pi 4B開發板

文/指尖動聽知識庫-谷谷 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:Openwrt開發-基于Raspberry Pi 4B開發板 有時候開發過程中經常會使用其他路由器,很多時候固件燒上去之后板子IP基本都是192.168.1.1,這時就需要修改板子的IP,下面介紹一下板…

Node.js系列(4)--微服務架構實踐

Node.js微服務架構實踐 🔄 引言 微服務架構已成為構建大規模Node.js應用的主流選擇。本文將深入探討Node.js微服務架構的設計與實現,包括服務拆分、服務治理、通信機制等方面,幫助開發者構建可擴展的微服務系統。 微服務架構概述 Node.js…

Docker逃逸

判斷是否再docker中 1.ls -a / (查看c根目錄查看是否有docker配置文件) 2.查看進程 如果在要逃逸到真實環境中: 特權模式進行docker逃逸:管理員執行eddocker run--privileg,如何判斷是否是特權模式() 特權模式以…

Vite管理的Vue3項目中monaco editer的使用以及組件封裝

文章目錄 背景環境說明安裝流程以及組件封裝引入依賴封裝組件 外部使用實現效果 v-model實現原理 背景 做oj系統的時候,需要使用代碼編輯器,決定使用Monaco Editor,但是因為自身能力問題,讀不懂官網文檔,最終結合ai和網友的帖子成功引入&…

pdf文件分頁按需查看

pdf預覽本來打算粗暴點,一次性查看全部,但是一個pdf四五百頁導致手機端查看超出內存直接崩掉,崩掉會導致頁面瘋狂刷新,所以不得不進行優化 解決思路大致如下: canvas轉為blob格式以圖片的形式加載在頁面(B…

算力100問?第92問:為什么各地熱衷建設算力中心?

目錄 1、宏觀分析 2、政府角度分析 3、投資者角度分析 在數字化浪潮中,各地對算力中心建設的熱情高漲,這一現象背后潛藏著諸多深層次的原因,涵蓋了經濟、科技、社會等多個維度,且彼此交織,共同驅動著這一發展趨勢。 1、宏觀分析 從經濟結構轉型的底層邏輯來看,全球經…

Redis 內存管理

Redis 內存管理 1. Redis 給緩存數據設置過期時間的作用 給緩存數據設置過期時間(TTL, Time-To-Live)有以下幾個重要作用: (1) 自動釋放內存 避免緩存數據無限增長,導致 Redis 內存溢出。例如,在 會話管理、短連接…

PyCharm中使用pip安裝PyTorch(從0開始僅需兩步)

無需 anaconda,只使用 pip 也可以在 PyCharm 集成環境中配置深度學習 PyTorch。 本文全部信息及示范來自 PyTorch 官網。 以防你是super小白: PyCharm 中的命令是在 Python Console 中運行,界面左下角豎排圖標第一個。 1. 安裝前置包 numpy …

掌握新編程語言的秘訣:利用 AI 快速上手 Python、Go、Java 和 Rust

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

如何理解java中Stream流?

在Java中,Stream 是 Java 8 引入的一個強大API,用于處理集合(如 List、Set、Map 等)數據的流式操作。它提供了一種聲明式、函數式的編程風格,可以高效地進行過濾、映射、排序、聚合等操作。 Stream 的核心概念 流&…

【Vitis AIE】FPGA快速部署ConvNet 示例MNIST數據集

AIE-ML 上的 MNIST ConvNet 版本:Vitis 2024.2 簡介 本教程在 AMD VersalTM 自適應 SoC AIE-ML 上實現了一個卷積神經網絡分類器,用于識別來自 MNIST 數據庫 的手寫數字。目標是說明如何將一個簡單的機器學習示例分區和向量化到 Versal AI 引擎。MNIS…

ubuntu桌面圖標異常——主目錄下的所有文件(如文檔、下載等)全部顯示在桌面

ubuntu桌面圖標異常 問題現象問題根源系統級解決方案方法一:全局修改(推薦多用戶環境)方法二:單用戶修改(推薦個人環境)操作驗證與調試避坑指南擴展知識參考文檔問題現象 主目錄文件異常顯示 用戶主目錄(如/home/user/)下的所有文件(如文檔、下載等)全部顯示在桌面,…

OceanBase 4.3.3 AP 解析:應用 RoaringBitmaps 類型處理海量數據的判重和基數統計

對于大數據開發人員而言,處理海量數據的判重操作和基數統計是常見需求,而 RoaringBitmap類型及其相關函數是當前非常高效的一種解決方案,許多大數據庫產品已支持RoaringBitmap類型。OceanBase 4.3.3版本,作為專為OLAP場景設計的正…