Java Gossip: autoboxing、 unboxing
2009-04-22 17:47
337 查看
在Java中,所有您要处理的东西“几乎”都是物件(Object),例如您之前所使用的Scanner是物件,字串(String)是物件,您之后还会看到更多的物件。
然而有些是例外,基本(Primitive)资料型态不是物件,也就是您使用int、double、boolean等宣告的变数,以及您在程式中直接写下的字面常量。
使用Java有一段时间的人都知道,有些时候您需要将基本型态转换为物件,例如使用Map时,要使用put()方法时需要的是物件而不是基本型态。
您要使用包裹型态(Wrapper Types)才能将基本资料型态包装为物件,例如在 J2SE 1.4.2 之前,您要如下才能将int包装为一个Integer物件:
Integer integer = new Integer(10);
在 J2SE 5.0 之后您可以这么写:
Integer integer = 10;
事实上编译器在背后自动根据您写下的陈述,为您进行自动装箱(Autoboxing)动作,同样的动作可以适用于 boolean、byte、short、char、long、float、double等基本型态,分别会使用对应的包裹型态(Wrapper Types)Boolean、Byte、Short、Character、Integer、Long、Float或Double。
自动装箱运用的方法还可以如下:
int i = 10;
Integer integer = i;
您也可以使用更一般化的Number,例如:
Number number = 3.14f;
3.14f会先被自动装箱为Float,然后指定给number。
J2SE 5.0中可以自动装箱,也可以自动拆箱(Unboxing),例如下面这样写是可以的:
Integer fooInteger = 10;
int fooPrimitive = fooInteger;
在运算时,也可以自动装箱与拆箱,例如:
Integer i = 10;
System.out.println(i + 10);
System.out.println(i++);
上例中会显示20与10,编译器会自动帮您进行自动装箱与拆箱,即10会先被装箱,然后在i + 10时会先拆箱,进行加法运算;i++该行也是先拆箱再进行递增运算。再来看一个例子:
Boolean boo = true;
System.out.println(boo && false);
同样的,先将boo拆箱,再与false进行AND运算,结果会显示false。
补充:
题目很简单
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i1==i2);
System.out.println(i3==i4);
正确答案是
true
false
这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
Boxing
在jdk1.4.2中,
必须是// Assigning primitive type to wrapper type
Integer iWrapper = new Integer(10);
java5中
// Assigning primitive type to wrapper type
Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5中
int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围,
boolean values true and false
All byte values
short values between -128 and 127
int values between -128 and 127
char in the range /u0000 to /u007F
如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
所以这段代码,大家不要奇怪
System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
第二行代码是0不等于0
因为大家犯这样的一个错误
static private final String LOCK = "LOCK";
void testMethod() {
synchronized(LOCK) {
...
}
}
应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。
然而有些是例外,基本(Primitive)资料型态不是物件,也就是您使用int、double、boolean等宣告的变数,以及您在程式中直接写下的字面常量。
使用Java有一段时间的人都知道,有些时候您需要将基本型态转换为物件,例如使用Map时,要使用put()方法时需要的是物件而不是基本型态。
您要使用包裹型态(Wrapper Types)才能将基本资料型态包装为物件,例如在 J2SE 1.4.2 之前,您要如下才能将int包装为一个Integer物件:
Integer integer = new Integer(10);
在 J2SE 5.0 之后您可以这么写:
Integer integer = 10;
事实上编译器在背后自动根据您写下的陈述,为您进行自动装箱(Autoboxing)动作,同样的动作可以适用于 boolean、byte、short、char、long、float、double等基本型态,分别会使用对应的包裹型态(Wrapper Types)Boolean、Byte、Short、Character、Integer、Long、Float或Double。
自动装箱运用的方法还可以如下:
int i = 10;
Integer integer = i;
您也可以使用更一般化的Number,例如:
Number number = 3.14f;
3.14f会先被自动装箱为Float,然后指定给number。
J2SE 5.0中可以自动装箱,也可以自动拆箱(Unboxing),例如下面这样写是可以的:
Integer fooInteger = 10;
int fooPrimitive = fooInteger;
在运算时,也可以自动装箱与拆箱,例如:
Integer i = 10;
System.out.println(i + 10);
System.out.println(i++);
上例中会显示20与10,编译器会自动帮您进行自动装箱与拆箱,即10会先被装箱,然后在i + 10时会先拆箱,进行加法运算;i++该行也是先拆箱再进行递增运算。再来看一个例子:
Boolean boo = true;
System.out.println(boo && false);
同样的,先将boo拆箱,再与false进行AND运算,结果会显示false。
补充:
题目很简单
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i1==i2);
System.out.println(i3==i4);
正确答案是
true
false
这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
Boxing
在jdk1.4.2中,
必须是// Assigning primitive type to wrapper type
Integer iWrapper = new Integer(10);
java5中
// Assigning primitive type to wrapper type
Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5中
int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围,
boolean values true and false
All byte values
short values between -128 and 127
int values between -128 and 127
char in the range /u0000 to /u007F
如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
所以这段代码,大家不要奇怪
System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
第二行代码是0不等于0
因为大家犯这样的一个错误
static private final String LOCK = "LOCK";
void testMethod() {
synchronized(LOCK) {
...
}
}
应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。
相关文章推荐
- What is autoboxing and unboxing in Java
- Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- 深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)
- java进阶--深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java中的自动封包和解包(Autoboxing和AutoUnboxing)
- java自动拆箱(unboxing)/装箱(autoboxing)
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- 详解Java的自动装箱与拆箱(Autoboxing and unboxing)
- [Java]Autoboxing & Unboxing
- Java5.0新特性02-自动装箱与拆箱(Autoboxing/Autounboxing)
- 【Java学习笔记】自动封包和解包(Autoboxing和AutoUnboxing)
- 【Java面试题-004】Java支持哪些数据类型?什么是Autoboxing和Unboxing?
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- Java程序低手之Autoboxing和unboxing