“由於開發人員可以想出描述數字的類,他們決定像真正的開發人員一樣發揮創造力。”

“首先,他們提出了一個抽象的 Number 類,從中派生了 Byte、Short、Integer、Long、Float 和 Double。它具有幫助將數字轉換為其他數字類型的方法。”

Number 類的方法
1個
int intValue()
2個
long longValue()
3個
float floatValue()
4個
double doubleValue()
5個
byte byteValue()
6個
short shortValue()

“對。畢竟,你不能這樣寫:”

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 方法:”

代碼 到底發生了什麼
Integer x = 5;
Integer x = Integer.valueOf(5);

“是啊,我已經從上面的例子中明白了。”

“但是,valueOf 函數並不總是創建一個新的 Integer 對象。”

“呃,‘不總是’是什麼意思?”

“它緩存從 -128 到 127 的值。”

代碼 到底發生了什麼 描述
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
變量 x、y 和 z 包含對不同對象的引用
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
變量 x、y 和 z 包含對同一對象的引用。
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
變量 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();”