關於hashcode 的一些問題

2021-08-22 14:17:11 字數 1290 閱讀 2019

這幾天用了很多hashtable,以前用也沒有發現問題,今天碰到一些意外,讓我花了些時間去弄清楚一些基本的也是核心的概念

先舉乙個例子:

stringbuffer buffer = new stringbuffer();

string a = buffer.tostring();

string b = "some";

現在有三個式子,結果在後面用注釋的形式標出:

a.equals(b);//true

a==b;//false

a.hashcode()==b.hashcode();//true

第乙個式子太容易理解了,就不說了

第二個式子我想了一會兒,起初我認為,既然string都是放在堆中的字串常量,那麼顯然的,既然a和b都是同樣的字串some,他們應當指向堆中的同乙個常量才對,也就是說它們的reference應當相同。但我發現不是這樣的,他們並不是指向同乙個常量,至少==的結果是false。我沒有找到相關的解釋,那麼a到底指向的是什麼東西呢,可以肯定的是應該不是放在堆裡面的字串常量,或者就是堆裡面允許有兩個同樣的字串常量。但是對於第二種解釋,為什麼"ab"=="ab"卻是true呢?看來只可能是第一種解釋,也就是說不是所有的string都是放在堆中的常量。然而,檢視stringbuffer的tostring()源**,返回的是乙個new string()。這樣結果是可以解釋了,但是為什麼堆中允許放兩個不同的同一字面的字串常量呢,不明白

第三個式子是偶然發現的,我本想把它們打出來看看到底是不是指向同乙個東東,然後發現他們的hashcode居然是一樣的,那只有一種解釋,就是我原先的理解是錯誤的。我原以為hashcode是object的唯一標識,現在發現可能不是的,因為hashcode只要求相同的object有相同的hashcode,並沒有要求不同的object有不同的hashcode,基本功沒打好,吃了虧了。這就明顯了,我查了string類中的hashcode()的源**,被重構過了,現在只是乙個對映函式而已,也就是說只要字面上相同,他們的hashcode就相同,而不管reference。或者說對於string而言,hashcode()和equals()的作用是相同的。那麼僅剩下==能夠用來判斷兩個string是否指向同乙個物件而不論他們的字面是否一樣

再乙個是關於hashtable,我看了它判斷key是否相同的源**,判斷條件是:hashcode()相同 && 滿足equals()。這兩個方法都是可以重構的,所以hashtable沒有用==,給了程式設計師實現自己的hashtable的好的途徑,的確sun想得很嚴密

小結一下,如果想判斷是否兩個物件引用指向同乙個實體,唯一的正確途徑是使用==,因為只有它不會被重構,要慎用hashcode

關於面試的一些問題

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...

關於Labview的一些問題

第一章 虛擬儀器及 labview入門 1 虛擬儀器概述 虛擬儀器 virtual instrumention 是基於計算機的儀器。計算機和儀器的密切結合是目前儀器發展的乙個重要方向。粗略地說這種結合有兩種方式,一種是將計算機裝入儀器,其典型的例子就是所謂智慧型化的儀器。隨著計算機功能的日益強大以及...

關於DropDownList的一些問題

dropdownlist選擇後提示不能在dropdownlist選擇多項 原因在於drop.selected true 用的是item的引用,無法覆蓋上次操作 有2種方法 一種是直接drop.selectvalue value 選定指定資料 另一種是在操作前 呼叫clearselection 方法清...