整数v / s int

时间:2012-09-01 03:13:08

标签: java wrapper primitive

在oracle docs java.lang页面上阅读:

  

通常有必要将原始类型的值表示为对象。包装类BooleanCharacterIntegerLongFloatDouble可用于此目的。

我不确定我理解为什么需要这些。它说它们具有有用的功能,例如equals()。但是,如果我能(a==b),我为什么要将它们声明为Integer,使用更多内存并使用equals()? 2?

的内存使用情况有何不同?

3 个答案:

答案 0 :(得分:10)

Java's generics system仅支持类类型。由于原语不是类,因此它们不能与泛型一起使用。但是,基元的包装类可以用作泛型类型。例如,您可能不会声明ArrayList<int>,但您可以使用ArrayList<Integer>实现类似的功能。

将变量的值初始化为null也偶尔会有用。但是,基元不能设置为null;该特权是为对象保留的。

// This is OK
Integer iDontKnowValueYet = null;

// Compile error!
int iDontKnowThisYetEither = null;

答案 1 :(得分:1)

int,char,double之类的东西都是原语,这意味着它们不需要使用“new”来实例化。像Integer,Character,Double这样的东西是在计算机上占用更多空间的对象(因为对象有更多的开销),但你可以使用Integer.parse()等方法。通常,如果需要其中一种方法,请使用基元并仅使用对象版本。

回答有关a == b vs a.equals(b)的事情:

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

即使它们是相同的值(这是.equals测试的),它们不是同一块内存,因为你说“new”两次。 a!= b但a.equals(b)

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

现在他们使用相同的内存,这意味着如果你改变它们,你可以更改它们(除非你再次使用“new”)。 a == b和a.equals(b)

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

现在又一次!= b但是a.equals(b)== true因为它们再次具有相同的值,但它们位于不同的内存块上。

答案 2 :(得分:0)

当你将它们放在数据结构中时,你的int通常包装在包装类中。因此,.equals方法用于确定何时在数据结构上调用.contains方法。

其他usefule方法: 的toString toHexString parseString