Long 操作符 的陷阱

2021-09-02 09:54:28 字數 1660 閱讀 1582

當兩個物件進行比較的時候,我們應該使用equals方法,但是由於基礎型別在1.5以前的jdk,大家已經習慣了 == 的方式,所以有時候,會馬虎大意依然使用 ==  進行比較,那麼這樣會有什麼問題嗎?結果是什麼??

12

3

4

5

6

7

8

9

10

11

long a2 = 127l;

long b2 = 127l;

system.out.println(a2 == b2);

結果是true,竟然是true???

long a3 = 128l;

long b3 = 128l;

system.out.println(a3==b3);

結果是false

這樣結果的原因是long型別內部有乙個內部類,維護了乙個cache,

見long原始碼 552行?

12

3

4

5

6

7

publicstaticlong valueof(longl)

returnnewlong(l);

}

見long原始碼 528行?

12

3

4

5

6

7

8

9

10

privatestaticclasslongcache

staticfinallong cache =newlong[-(-128) +127+1];

static

}

-128到127直接的值都放在cache裡,不會建立新的物件,所以==比較的時候,結果是正確的,

當超過這個範圍,因為是建立的新物件,所以自然不會相等

邏輯操作符的陷阱

運算元只有兩種值 true和false 邏輯表示式不用完全計算就能確定最終值 最終結果只能是true或者false 那麼,如果我們過載邏輯運算子會發生什麼?例 1 include 2 include 3using namespace std 4class test 512 test 1315 int...

38 邏輯操作符的陷阱

邏輯操作符的原生語義 運算元只有兩種值 true和false 邏輯表示式不用完全計算就能確定最終值,最終結果只能是true或者false。邏輯操作符可以過載嗎?include include using namespace std int func int i int main else cout ...

第38課 邏輯操作符的陷阱

1.1 運算元只有兩種值 true和false 1.2 邏輯表示式不用完全計算就能確定最終值 1.3 最終結果只能是true或false 邏輯表示式 又叫短路表示式 include using namespace std int func int i int main else cout endl ...