05 January 2013
Integer是Java中的wrapper type(reference type)!

簡單地說它是一個類別,每當你使用它一次就會有一個新的object產生!
因為所有的wrapper type 都屬於immutable的!
拿String的例子來說,
String strA = "hi";
strA = "hello";
上面這個例子實質上在記憶體裡面是有2個object產生!
因為他是immutable!

Integer也是一樣!
但這篇要講的是Integer的一個pool機制!
pool機制是為了效能所存在!
直接從下面的例子來看

Integer iA = 100;
Integer iB = 100;
System.out.println(iA==iB); // true


Integer iA = 128;
Integer iB = 128;
System.out.println(iA==iB); // false


Integer iA = new Integer(100);
Integer iB = new Integer(100);
System.out.println(iA==iB); // false

int iA = 128;
int iB = 128;
System.out.println(iA==iB); // true

大家可能會覺得奇怪,為什麼第二個範例和第三個會是false
因為對於wrapper type來說,使用==符號比較的話,是在比較其記憶體位址!!!
並不是在比較value!

那大家可能也會覺得奇怪,那為什麼第一個就是true?
因為Integer有一個pool機制(String也有pool機制)!
而這個pool裡面存放的value為-128~127!
也就是說當value在-128~127之間的話,都會從pool中存取,
並不會重新產生一個object!

那大家可能也會覺得那麼第三個例子為什麼是false?
value是100阿!有在pool範圍內!
那是因為已經使用new了!竟然使用new,就會配置一塊新的記憶體給它!


第四個範例的value超過pool了,
但結果還是true的原因是因為第四個範例並不是wrapper type!
而是primitive type!
primitive type的比較符號==就是在比value!


那麼可能有人會好奇什麼時候使用int或Integer,
恩,Integer他是屬於類別,因此他會有比較fancy的method使用,
當你可能得對你的value做一些較複雜的操作時或許就可以使用Integer!

還有就是當你有使用Collection時,
記得請使用wrapper type!
雖然說java目前都有支援auto-boxing的機制,儘管你傳入primitive,
java都會幫你轉成wrapper type!
但這個轉換的機制是很會消耗效能的!
因此在這種情況也請使用wrapper type!




上面有提到String也有pool機制,
但String pool並沒有範圍限制!
只要你使用過的String都會被放置在pool之中!












blog comments powered by Disqus