代碼:如下
public static void main(String[] args)
{
Stack stack = new Stack<>();
stack.push(1);
stack.push(2);
System.out.println(stack.hashCode());// hashcode輸出994
for (Integer i : stack)
{
System.out.println(i); // 輸出1 2
}
changeStack(stack);
System.out.println(stack.hashCode());// hashcode輸出32
for (Integer i : stack)
{
System.out.println(i);//輸出1
}}
public static void changeStack(Stack<Integer> stack)
{
stack.pop();
}
問題:
為什么stack在changeStack()之后,居然連hashcode都變了呢?我知道stack的值會(huì)改變的,只是不知道為啥內(nèi)存地址也會(huì)變,前后的hashcode不應(yīng)該一樣么?我用Stringbuffer類,對(duì)他append之后,前后的hashcode一樣。為啥Stack會(huì)這樣呢?
1 回答
慕尼黑的夜晚無(wú)繁華
TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
朋友,首先糾正一個(gè)問題,hashcode 值 并不是Stack的地址的引用,也不是Stack中元素的地址引用。根據(jù)繼承關(guān)系分析,
Stack調(diào)用的AbstractList抽象類HashCode方法或者h(yuǎn)ashCode值。



從圖中可以看出,HashCode值得計(jì)算并不是地址引用,但是跟元素的HashCode有關(guān)聯(lián),即元素的HashCode值參與了計(jì)算。
我們Stack中存在的元素是Integer類型,而Integer 類型的HashCode值實(shí)際上就上Integer的value,即我們存儲(chǔ)的值,如圖:

經(jīng)過(guò)這段介紹我想你應(yīng)該可以可以理解了吧~
添加回答
舉報(bào)
0/150
提交
取消
