在oracle docs java.lang页面上阅读:
通常有必要将原始类型的值表示为对象。包装类
Boolean
,Character
,Integer
,Long
,Float
和Double
可用于此目的。
我不确定我理解为什么需要这些。它说它们具有有用的功能,例如equals()
。但是,如果我能(a==b)
,我为什么要将它们声明为Integer
,使用更多内存并使用equals()
? 2?
答案 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