在 oracle 文档java.lang页面上阅读此内容:
通常需要将原始类型的值表示为对象。包装类
Boolean
,Character
,Integer
,Long
,Float
和Double
用于此目的。
我不确定我理解为什么需要这些。它说它们具有有用的功能,例如equals()
. 但如果我能做到(a==b)
,我为什么要声明它们Integer
,使用更多内存和使用equals()
?2的内存使用情况有何不同?
在 oracle 文档java.lang页面上阅读此内容:
通常需要将原始类型的值表示为对象。包装类
Boolean
,Character
,Integer
,Long
,Float
和Double
用于此目的。
我不确定我理解为什么需要这些。它说它们具有有用的功能,例如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.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 因为它们再次具有相同的值但它们位于不同的内存块上。
当您将整数放入数据结构中时,它们通常被包装在包装类中。因此,.equals 方法用于确定何时在数据结构上调用 .contains 方法。
其他有用的方法: toString toHexString parseString