这两行之间有什么区别?
int pInt = 500;
和
Integer wInt = new Integer(pInt);
或者
Integer wInt = new Integer(500);
答案 0 :(得分:15)
无。
这是完全相同的事情。在第一种情况下,你只有一个补充变量。
请注意,对于autoboxing,您很少需要同时拥有int
和Integer
个变量。所以对于大多数情况来说这就足够了:
int pInt = 500;
整数有用的主要情况是区分变量未知的情况(即null
):
Integer i = null; // possible
int i = null; // not possible because only Object variables can be null
但是不要保留两个变量,一个就足够了。
答案 1 :(得分:7)
首发
int pInt = 500;
,此处pInt
不是对象,而是
Integer wInt = new Integer(500);
wInt
是参考
这也是java不是纯面向对象语言的原因。因为一切都不是java的对象。
答案 2 :(得分:6)
在Java中,primitve类的实例保存实例的实际值,但包装类的实例包含对该对象的引用。即找到对象的地方的地址。
使用此行编写程序时:
Integer integer = 500;
编译器将其更改为:
Integer integer = new Integer(500);
此过程称为 autoboxing 。这是自动将原始实例放在Integer的“框”中。因此,输出以下程序:
public class PrimitiveToObject {
public static void main(String[] args) {
printClassName(1);
printClassName(1L);
printClassName((char)1);
}
public static void printClassName(Object object){
System.out.println(object.getClass());
}
}
就是这样:
class java.lang.Integer
class java.lang.Long
class java.lang.Character
还有:
int i = integer;
更改为:
int i = integer.intValue();
这称为拆箱。
如上所示,点运算符(.
)用于名为integer
的变量,但不用于i
。也就是说:包装器的对象可以是解除引用,但不是原始实例。
拳击和拆箱可能会使程序变慢一点。因此,对于一个新手来说,包装可能看起来像增加了负担,但事实并非如此。包装器用于对象需要作为引用类型的位置。例如:Map<Integer,String>map=new HashMap<Integer,String>();
是一个有效的语句,但Map<int,String>map=new HashMap<int,String>();
不是有效的语句。
包装器非常有用的另一种典型情况:
在MySQL中,NULL
是INT
类型列的有效条目。但在Java中,int
不能有null
值,Integer
可以。这是因为在SQL NULL
中符号不可用。因此,如果您使用JDBC在MySQL表中插入整数值,则java程序中的null
将有助于在MySQL表中插入NULL
。
包装类在与此类似或相似的情况下也很有用:
Boolean decision; // Using wrapper for boolean.
if("YES".equalsIgnoreCase(consent))
decision = Boolean.TRUE; // In favour
else if("NO".equalsIgnoreCase(consent))
decision = Boolean.FALSE; // Not in favour
else if("CAN'T SAY".equalsIgnoreCase(consent))
decision = null; // Undecided
答案 3 :(得分:2)
除非你需要一个物体,否则你应该使用原始类型
包装类可以是null
,但原始类型Ex:Integer
可以是null
,int
则不能。
这是primitive data type初始化:
int pInt = 500;
这是为相同的原始数据类型创建包装类:
Integer wInt = new Integer(pInt);
Java API中的wrapper classes有两个主要目的:
在 Java 1.5 中,有一个名为Autoboxing的概念。它具有在对象包装器和它的原始类型之间转换或转换的能力。
这意味着:
Integer wInt = 500;
int pInt = new Integer(500);
由于Autoboxing,这是可能的。
答案 4 :(得分:2)
Wrapper类将在该框中有一个框,它将覆盖原始数据类型,有8种原始数据类型,即byte,int,long,double,float,short,Boolean,char这些都包含在包装类中。
使用我们使用的原始数据类型,如int a;
但要使用包装器类,我们需要像Integer a = new Integer(i);
答案 5 :(得分:1)
数据的类型是相同的,但有些情况下,对象的操作比原始类型(如数据结构)更方便,您需要更多地控制数据类型。
例如,对象可以为null,而原始类型则不能。
你也不能用基本类型(.compareTo(),. equals(),...)调用方法,但是在包装类中你可以。
以下信息描述了原语和包装类中的类型:
原始类型|包装类(超类=对象)
原始类型|包装类(超类=数字)
要了解wapper类的工作原理,请考虑以下示例:
public final class IntWrapper {
private final int intVal;
IntWrapper(int intVal) {
this.intVal = intVal;
}
public int getInt() {
return intVal;
}
}
现在我们可以从新的IntWrapper类和&#39;框中创建一个对象。原始int值41:
int i = 41;
IntWrapper iw = new IntWrapper( i ); // box the primitive int type value into the object
i = iw.getInt(); // unbox the value from the wrapper object
我的示例IntWrapper类是不可变的,不可变的意味着一旦其状态被初始化,其状态就无法改变。 将final关键字应用于类时,无法扩展最终类。换句话说,final类永远不能是子类的超类。最后一个类可以是超类的子类,而不是那里的问题。当一个类被标记为final时,它的所有方法都是隐式最终的。
重要的是要注意,当final应用于引用变量时,它不会阻止对象实例的成员更改值。
这个例子是为了更好地理解包装类在内部的工作原理。
接下来,要创建Integer,Double和其他包装类,您可以编写:
Integer i = new Integer(4);
Double d = new Double(9.62);
Boolean b = new Boolean("true");
Character c = new Character('M');
要将封装的数字放入包装器对象,您可以编写:
long l = i.longValue();
double e = i.doubleValue();
float f = d.floatValue();
short s = d.shortValue();
每个包装类都包含将原始类型转换为包装器对象的特殊方法,它们不代表数字值:
boolean bo = b.booleanValue();
char ch = c.charValue();
直到Java 5版本,包装类中对象的创建必须采用上述语法,但是为了简化这些操作,主要涉及在Java集合中提供的数据结构中插入值(仅接受对象) ),现在存在自动装箱或装箱和自动装箱或拆箱选项。
autoboxing或boxing允许您插入原始值以引用等效包装类型或对象类型:
// Same result of Double d = new Double(-2.75);
Double objD = -2.75;
// Same result of Object objI = new Integer(13);
Object objI = 13;
自动装箱或取消装箱允许您将包装器对象插入到基本类型的变量中,并在等效类型之间自动转换:
// Same result of double vd = objD.doubleValue();
double vd = objD;
// Same result of int vi = objI.intValue();
int vi = objI;
答案 6 :(得分:0)
我发现最重要的实际差异是Integer
初始化和使用int
进行计算的速度要慢一些。除非必要,否则我会避免使用Integer
。
int x = 20_000_000;// 20 millions
for (int i = 0; i < x; i++) {
ix += 23;
}
当ix是整数时需要138 ms(平均超过50次试验)才能完成循环,但当ix是int时只需要10 ms