2012-09-01 41 views
3

閱讀本oracle的文檔java.lang頁上:整數v /秒INT

經常有必要表示原語類型的值,好像它是一個對象。該包裝類BooleanCharacterIntegerLongFloatDouble達到這個目的。

我不知道我理解爲什麼這些是必要的。它表示它們具有有用的功能,如equals()。但如果我可以做(a==b),爲什麼我會想要宣佈他們爲Integer,使用更多的內存和使用equals()? 2的內存使用情況如何不同?

回答

10

Java's generics system只支持類類型。由於原語不是類,所以它們不能用於泛型。但是,基元的包裝類可以用作泛型類型。例如,您可能不會聲明ArrayList<int>,但您可以使用ArrayList<Integer>實現類似的功能。

這也是偶爾使用的一個變量的值初始化爲null。但是,原始圖不能設置爲null;該特權是爲對象保留的。

// This is OK 
Integer iDontKnowValueYet = null; 

// Compile error! 
int iDontKnowThisYetEither = null; 
+0

+1甚至在泛型,集合,列表,集合和映射之前,僅存儲對象。 –

+0

我明白了。但是,爲什麼Java設計者設計的泛型不能與基元和int一起工作,在初始化時不能設置爲null,他們肯定看到了使用Integer比int更有用的東西嗎? – Siddhartha

+0

集合不接受原語的事實與泛型沒有任何關係。 –

0

你的整數通常包裝在包裝類,當你把它們放在一個數據結構。因此,.equals方法用於確定何時在數據結構上調用.contains方法。

其他usefule方法: 的toString toHexString parseString

1

事情如int,焦炭,雙都是原語意味着它們並不需要通過使用「新」被實例化。像Integer,Character,Double這樣的東西是在計算機上佔用更多空間的對象(因爲對象有更多的開銷),但是可以使用像Integer.parse()這樣的方法。一般來說,如果你需要其中的一種方法,使用原語並只使用對象版本。

要回答的東西有關== B對a.equals(B):

Integer a = new Integer(5); 
Integer b = new Integer(5); 

即使它們是相同的值(這是什麼.equals試驗),他們是不一樣的一塊內存,因爲你說「新」兩次。一個!= B,但a.equals(B)

Integer a = new Integer(5); 
Integer b = a; 

現在,他們使用同一塊內存,如果你改變一個意思,你改變他們兩個(除非你用「新」了)。 A == B和a.equals(B)

//using last code block 
b = new Integer(5); 

現在再一次!= B,但a.equals(二)==真因爲再次它們具有相同的價值,但它們是在不同的片記憶。

+0

兩件事。首先,整數。解析也可以用於基元類型。實際上,Integer.parseInt返回int而不是Integer。其次,你不能像你所建議的那樣改變變量'a',因爲Integer是一個不可變的類。 –

+0

@ axelrod360我看到等於可用於比較值與比較參考。 我猜Integer有parseInt定義在它裏面,所以可以從那裏調用它。 – Siddhartha