試寫出下列**的執行結果
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...