“由於開發人員可以想出描述數字的類,他們決定像真正的開發人員一樣發揮創造力。”
“首先,他們提出了一個抽象的 Number 類,從中派生了 Byte、Short、Integer、Long、Float 和 Double。它具有幫助將數字轉換為其他數字類型的方法。”
Number 類的方法 | |
---|---|
1個 |
|
2個 |
|
3個 |
|
4個 |
|
5個 |
|
6個 |
|
“對。畢竟,你不能這樣寫:”
Long x = 100000;
Integer y = (Integer) x;
“是的,這些類型不是原始類型。這就是我們使用 Number 類方法的原因:”
Long x = 100000;
Integer y = x.intValue();
“但仍有幾件事需要考慮。因為 Integer 不是 int,所以 Integer 對象無法與經典的 «==» 運算符進行比較。”
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
“正是。不知怎的,我沒有立刻想到這一點。”
“但還有更多。”
“你在短路我的電路!還有什麼?”
“當我們將 int 值分配給 Integer 變量時,將調用 Integer.valueOf 方法:”
代碼 | 到底發生了什麼 |
---|---|
|
|
“是啊,我已經從上面的例子中明白了。”
“但是,valueOf 函數並不總是創建一個新的 Integer 對象。”
“呃,‘不總是’是什麼意思?”
“它緩存從 -128 到 127 的值。”
代碼 | 到底發生了什麼 | 描述 |
---|---|---|
|
|
變量 x、y 和 z 包含對不同對象的引用 |
|
|
變量 x、y 和 z 包含對同一對象的引用。 |
|
|
變量 z 和 t 包含對同一對象的引用。 |
“也就是說,情況是這樣的:”
1) 如果我們寫«new Integer()»,那麼我們保證得到一個新對象。
2) 如果我們顯式地或通過自動裝箱調用 Integer.valueOf(),那麼如果數字參數在 -128 到 127 的範圍內,該方法可能會返回一個新對像或緩存的對象。
“從緩存中返回對象的方法有什麼可怕的?”
“沒關係。你只需要知道,有時,當你不期望它時,對象可能是相等的。任何具有相等性的東西都很複雜。如果我們比較一個原始的和一個非原始的,那麼它們被當作原始的進行比較:”
int x = 300;
Integer y = 300;
Integer z = 300;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
int x = 100;
Integer y = 100;
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
int x = 100;
Integer y = new Integer(100);
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)
“太好了……我要怎麼記住這些呢?”
“你不需要記住這個。你只需要了解這一切是如何組織的,以及當原始和非原始對應物發揮作用時實際發生了什麼。”
“我還建議你看看Integer類的方法,它有很多好用的方法,你甚至經常使用其中一個。”
“是的,我記得。Integer.parseInt();”
GO TO FULL VERSION