A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© konglingzhiyu 中级黑马   /  2015-3-17 08:03  /  1048 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
1.对两个包装类对象进行==比较时,比较的是对象的内存地址,而不是包装类所封装的基本类型数据的值,于是
Integer i1 = new Integer(20);
Integer i2 = new Integer(20);
system.out.println(i1==i2);//false
2.包装类缓存

先看下面一段程序:

public class test {


public static void main(String[] args) {

Integer i1 = 10;
       Integer i2 = 10;
       Integer i3 = 200;
       Integer i4 = 200;
       System.out.println(i1==i2);//true
       System.out.println(i3==i4);//false
       System.out.println("-------------------");
  
       Long l1 = 10L;
       Long l2 = 10L;
       Long l3 = 200L;
       Long l4 = 200L;
       System.out.println(l1==l2);//true
       System.out.println(l3==l4);//false
       System.out.println("-------------------");
  
       Float f1 = 10f;
       Float f2 = 10f;
       Float f3 = 200f;
       Float f4 = 200f;
       System.out.println(f1==f2);//false
       System.out.println(f3==f4);//false
       System.out.println("-------------------");
  
       Double d1 = 10d;
       Double d2 = 10d;
       Double d3 = 200d;
       Double d4 = 200d;
       System.out.println(d1==d2);//false
       System.out.println(d3==d4);//false
       System.out.println("-------------------");
  
}

}

不同的值对于同一个包装类来说,使用==运算得出不同的结果,这要从包装类是不可变的说起。就像String类的对象,一被创建变不可改变,所以,多个引用指向同一个String对象也不会有危险,因此编译阶段将String放入字符常量池中,但下次使用时直接从中提取,而对于包装类来说其对象同样是不可改变的,对于某些频繁使用的值,系统提供了包装类的缓存(预先创建了使用的包装类对象,可以参考包装类的valueOf方法),但需要时直接从缓冲中提取,而不要再创建一个新的包装类对象,这些缓存的包装类的值如下:
boolean的所有值(true false)
byte的所有值(-128-127)
char值的0-127
short值的-128-127
int值的-128-127
long值的-128-127
对以上数据进行封箱的时候并不是创建一个新的对象,而是使用缓存的对象,这样就可以避免重复使用的时候创建对象造成的浪费。但是注意,对于浮点型float和double,包装类没有缓存。
3.封箱还是拆箱?
在Java中==和!=可以作用于任何类型,但如果这两个二元运算符的两个操作数一个是基本数据类型,另一个是包装类,则将包装类拆箱成基本数据类型然后对两个值进行比较。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马