當兩個物件進行比較的時候,我們應該使用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
public
static
long valueof(
long
l)
return
new
long(l);
}
見long原始碼 528行?
12
3
4
5
6
7
8
9
10
private
static
class
longcache
static
final
long cache =
new
long[-(-
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 ...