踩坑筆記之Integer數值比較

2021-07-06 11:10:36 字數 1461 閱讀 1894

很多東西,表面上看起來挺簡單,實際上別有洞天,一不小心就是乙個坑。記錄一下昨天遇到的integer數值比較所遇到的「奇葩bug」。

1.問題場景

先看如下一段**

if(activity.gettotalcounts()==activity.getparticipationcounts())
activity.gettotalcounts() 和activity.getparticipationcounts()的值都是integer型別,在兩者數值都一樣的時候,測試發現vo.setprobableopentime(new date(time)); 這段**竟然有時候能執行到,有時候卻不行。比如 都等於100時,能夠執行到這段**,都等於200時卻不行了,好奇怪的問題,都是一樣的數值怎麼就有時候成立,有時候不成立呢!於是有了下面這段測試**

2.integer數值比較單元測試

@test

public

void

integertest()

輸出結果為:

true

false

true

結果可知,integer 用==比較數值確實有時候成立,有時候卻不行。

3.問題的本質

想知道為啥有這麼奇怪的結果,還是要看看源**的,如下:

* this method will always cache values in the range -128 to 127,

* inclusive, and may cache other values outside of this range.

public

static integer valueof(int i)

integer a = 100實際上呼叫了valueof(int i)方法。

這裡low是-128,high是127,從方法的注釋中可以得知,在[-128,127]之間,integer總是快取了相應數值物件,這樣每次取值時都是同乙個物件,而不在此區間時,則不一定會快取,那麼取出兩個同樣數值大小的物件則不是同乙個物件,每次都會new integer(i);,所以其物件的位址不同,則用==比較是自然不會成立。integer快取的目的正如注釋所言better space and time performance by caching frequently requested values.但是個人以為這樣的設計又何嘗不是雷區!

為了防止不小心掉入這樣的陷阱,對於基本型別的比較,用「==」;而對於基本型別的封裝型別和其他物件,應該呼叫public boolean equals(object obj)方法(複雜物件需要自己實現equals方法)。

昨天解決完問題,突然靈光一現,我嚓,這是多有趣的一道面試題啊,下次面試別人時,我得問問,哈哈!

Integer 型別數值判斷相等的坑

記錄乙個曾面試遇到的題目,看似簡單,實則有坑。題目 public static void main string args 寫下輸出結果 true false 以上是正確答案,親測。why?因為本姑娘答了兩個 true,然後.不說了,都是淚 我們在給 integer 型別變數賦值時,integer ...

踩坑 Integer型別的整數比較大小

先劃重點 integer型別的整數比較數值大小用equals.和intvalue 盡量別用 去比較是否相等 之前沒注意過integer型別比較數值大小,一直在用 某天,寫的一段程式沒跑通,才注意到這個問題 public static void main string args 結果 true tru...

Celery 踩坑筆記

常用的類from kombu import exchange,queue。celery task 中不允許呼叫別的 task 後阻塞式的 get 等待結果。版本 3.2 後會對此行為丟擲異常。根據官方文件,應該使用類似管道形式的呼叫來解決。但是我想根據第乙個 task 的結果指定 route key...