2012-09-01 37 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