3

在 oracle 文档java.lang页面上阅读此内容:

通常需要将原始类型的值表示为对象。包装类Boolean, Character, Integer, Long,FloatDouble用于此目的。

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

4

3 回答 3

10

Java 的泛型系统只支持类类型。而且由于原语不是类,它们不能与泛型一起使用。但是,原语的包装类可以用作泛型类型。例如,您可以不声明ArrayList<int>,但可以使用 实现类似的功能ArrayList<Integer>

它也偶尔用于将变量的值初始化为null. 然而,基元不能设置为null; 该特权是为对象保留的。

// This is OK
Integer iDontKnowValueYet = null;

// Compile error!
int iDontKnowThisYetEither = null;
于 2012-09-01T03:16:26.213 回答
1

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

要回答关于 a==b 与 a.equals(b) 的问题:

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

即使它们是相同的值(这是 .equals 测试的),它们也不是同一块内存,因为您两次说“新”。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);

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

于 2012-09-01T04:53:18.367 回答
0

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

其他有用的方法: toString toHexString parseString

于 2012-09-01T03:15:42.563 回答