整数v/s整数



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

经常需要将基元类型的值表示为对象。包装类BooleanCharacterIntegerLongFloatDouble用于此目的。

我不知道为什么需要这些。它说它们有一些有用的功能,比如equals()。但是,如果我可以做(a==b),为什么我要将它们声明为Integer,使用更多的内存并使用equals()?2的内存使用情况有何不同?

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

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

// This is OK
Integer iDontKnowValueYet = null;
// Compile error!
int iDontKnowThisYetEither = null;

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

要回答关于a==b与a的问题,等于(b):

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

即使它们是相同的值(这就是.equals测试的目的),它们也不是同一块内存,因为你说了两次"new"。a=b但a.等于(b)

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

现在它们使用相同的内存,这意味着如果你更改一个,你就同时更改它们(除非你再次使用"new")。a==b且a等于(b)

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

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

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

其他有用的方法:toStringtoHexStringparseString

最新更新