2015-06-24 46 views
0

我使用Java Stack遇到了一個非常棘手的問題。我在Java Stack類中發現了一個錯誤嗎?爲什麼這兩個堆棧元素不一樣?

Stack<Integer> s=new Stack(), ss=new Stack(); 
s.push(1024); ss.push(1024); 
System.out.println(s.peek()); 
System.out.println(ss.peek()); 
System.out.println((s.peek()==ss.peek())); 
System.out.println((s.peek()<ss.peek())); 
System.out.println((s.peek()<=ss.peek())); 
System.out.println((s.peek()!=ss.peek())); 

請參閱上面的代碼。 但爲什麼輸出是這樣?

1024 
1024 
false 
false 
true 
true 

這是Java中的錯誤嗎?有一個幫助.... 謝謝,啓

+1

use's.push(120); ss.push(120);'而是檢查你的程序...;)。如果您現在感到困惑,請閱讀以下內容:[爲什麼128 == 128返回false,但127 == 127在此代碼中返回true?](http://stackoverflow.com/questions/1700081/why-does-128 -128-return-false-but-127-127-return-true-in-this-code) – Tom

回答

7

不,這是沒有錯誤,並沒有任何關係Stack和所有關於Integer類。理解整數是參考類型,因此兩個整數可以是.equal(...)而不是==。瞭解在參考類型==上使用時檢查兩個對象引用是否相同,這不是您感興趣的內容。另一方面,equals(...)方法檢查兩個Integer對象持有的值是否相同,這是重要的。這與我們檢查字符串相等的情況類似。

如果你做的事:

// convert Integers to ints and test for primitive equality: 
System.out.println((s.peek().intValue() == ss.peek().intValue())); 
// or test using the equals(...) method 
System.out.println((s.peek().equals(ss.peek()))); 
// or test with Integer#compareTo: 
System.out.println((s.peek().compareTo(ss.peek()) == 0)); 

你會得到:

真正
真正
真正

還要注意這個有趣的問題:Why does 128==128 return false but 127==127 return true in this code?。答案解釋爲什麼上Integer變量相等的引用(即==上引用類型)檢查用於在一定範圍整數常量的返回true,像在本例中:

System.out.println((Integer) 1024 == (Integer) 1024); 
System.out.println((Integer) 127 == (Integer) 127); 

打印:


true

+0

你可能想補充一下,用==來檢查相等的引用是否適用於一定範圍的整數文字。或者將這些問題作爲重複來回答:D。 ...編輯:哦,太晚了:D – Tom

+1

@Tom:true,true。將製作一個社區wiki並關閉它。 –

相關問題