一道關於HashSet的題目

2021-10-04 08:23:45 字數 2488 閱讀 7937

試寫出下列**的執行結果

hashset

set =

newhashset()

;person p1 =

newperson

(1001

,"aa");

person p2 =

newperson

(1002

,"bb");

set.

add(p1)

;set.

add(p2)

;p1.name =

"cc"

;set.

remove

(p1)

;system.out.

println

(set)

; set.

add(

newperson

(1001

,"cc"))

;system.out.

println

(set)

;set.

add(

newperson

(1001

,"aa"))

;system.out.

println

(set)

;

person類如下

public

class

person

@override

public

inthashcode()

@override

public string tostring()

';}public

person

(int id, string name)

}

很有意思啊,先看下執行結果

根據執行結果可以看到remove語句並沒有執行成功,但是為什麼可以add cc,aa兩個物件進來呢?不是已經重寫equals和hashcode方法了嗎?

讓我們從頭開始分析

hashset

set= new hashset();

person p1 = new person(

1001

,"aa");

person p2 = new person(

1002

,"bb"

);

p1,p2此時的hash值分別為34072,34135

set

.add(p1)

;// 按照 hash

=34072 存放p1

set.add(p2)

;// 按照 hash

=34135 存放p2

這個時候add是根據此時的hash值存放

p1.name =

"cc"

;

p1 hash值變為34136,但是在set中,p1的存放位置仍然是34072

set.

remove

(p1)

;

當我們嘗試remove p1的時候,是根據p1的hash值在set中查詢是否有hash值相等的物件,有則進一步判斷

這乙個if就過不了

很顯然set中34136並沒有存放資料,所以remove失敗了,p1自然沒有被移除

此時的列印結果為

[person, person]

set.

add(

newperson

(1001

,"cc"))

;

當我們嘗試新增乙個這個物件的時候,儘管內容相同,但是還是可以新增成功

這個物件的hash值為34136,和此時p1的hash值相同,但是!! 此時的add是根據34136來add,set中34136並沒有存放物件,p1存放在34072裡面,並沒有產生衝突,所以新增成功了!

[person, person, person]

set.

add(

newperson

(1001

,"aa"))

;

此時hash值與34072相等,p1確實存放在34072裡面,但是equals的結果並不相等,仍然可以放入

[person, person, person, person]

所以最終結果就是上面這樣了

這道題目告訴我們,盡量不要對set,map中的物件進行修改

360一道關於this的題目

原題目是這樣子的 window.val 1 var obj 說出下面的輸出結果 obj.dbl var func obj.dbl func this呢其實就是這樣,分清楚呼叫就好了。obj中的沒有指定呼叫。預設從函式中查詢。如果沒有則往上一級查詢。所以 上面的式子可以寫成這樣 window.val ...

一道this的題目

請問下面 中的this值指向的是全域性物件還是物件o?function f return c var o new f console.log o.constructor.name object這裡的this指向全域性物件,因為 c call without new。這裡用正常的方式呼叫的函式 c 所...

關於多執行緒的一道題目

題目大意 有四個執行緒,每個執行緒輸出1,2,3,4,設計程式使得依次輸出 1111222233334444 求解思路 建立乙個物件o,當四個執行緒依次輸出1後,檢測已經輸出的次數count,如果輸出次數為1,2,3,那麼讓執行緒進入物件o的等待集,如果為4,那麼喚醒o中等待集中所有執行緒並將cou...