java中什么是自动拆装箱,Java自动拆箱

  java中什么是自动拆装箱,Java自动拆箱

  一、什么是装箱,什么是拆箱

  装箱:将基本数据类型转换成包装类。

  解包:将打包类转换为基本数据类型。

  基本数据类型对应的打包类:

  Int(几个字节4)-整数

  字节(1)-字节

  短(2)-短

  long(8)- Long

  浮动(4)-浮动

  双(8)-双

  char(2)-字符

  布尔型(未定义)-布尔型

  免费在线视频学习教程推荐:java视频教程

  二、先来看看手动装箱和手动拆箱

  举例:以int和Integer为例。

  integer i1=integer . value of(3);

  int I2=i1 . int value();手动装箱由valueOf完成。大家都知道=右边的值赋给左边,3是int类型。赋值给左边成为一个整数包装类。

  手动解包是通过intValue()完成的,从代码中可以看出i1已经从整数变成了int。

  三、手动看完了,来看自动的

  为了减少技术人员的工作,java从jdk1.5换成了自动打包解包。以上面的例子为例:

  手动:

  integer i1=integer . value of(3);

  int I2=i1 . int value();自动的

  整数i1=3;

  int i2=i1默认情况下,这已经自动安装和拆卸。

  四、从几道题目中加深对自动装箱和拆箱的理解

  (1)

  整数a=100

  int b=100

  system . out . println(a==b);结果是真的。原因:A会自动解包和B比较,所以是真的。

  (2)

  整数a=100

  整数b=100

  system . out . println(a==b);//结果为真

  整数a=200

  整数b=200

  system . out . println(a==b);//结果是假的。这里有个有趣的事情。为什么两个变量相同,只有一个值不同的为真,另一个为假?

  原因:在这种情况下,我们要讲比较符号==,比较的内存地址,也就是新对象的内存地址。看到这里你可能会问,看似没有新的,其实整数a=200200前面默认是new Integer,使用的内存地址不同==比较为假,但是为什么100为真?这是因为java中的常量池。我们可以点击Integer的源代码来看看。

  私有静态类IntegerCache {

  静态最终int low=-128;

  静态最终int高;

  静态最终整数缓存[];

  静态{

  //高值可以由属性配置

  int h=127

  字符串integerCacheHighPropValue=

  sun . misc . VM . getsavedproperty( Java . lang . integer . integer cache . high );

  if (integerCacheHighPropValue!=null) {

  尝试{

  int I=parse int(integerCacheHighPropValue);

  i=Math.max(i,127);

  //最大数组大小是整数。最大值

  h=Math.min(i,整数。MAX _ VALUE-(-低)-1);

  } catch(NumberFormatException nfe){

  //如果该属性无法解析为int,则忽略它。

  }

  }

  高=h;

  cache=新整数[(高-低)1];

  int j=低电平;

  for(int k=0;k cache.lengthk)

  cache[k]=新整数(j);

  //必须保留范围[-128,127](jls 7 5 . 1 . 7)

  断言IntegerCache.high=127

  }在-128和127之间比较时,对象不会是新的,而是直接从常量池中获取,所以100为真,200超过这个范围再进行新的操作,所以内存地址不同。

  (3)

  整数a=新整数(100);

  整数b=100

  system . out . println(a==b);

  //结果是假的。这个和上面那个100差不多。从常量池中取出。为什么是假的?

  原因:因为新的整数(100),虽然100可以在常量池中取,但是经不起你直接给new一个对象。使用的两个内存地址是不同的。

  (4)

  整数a=100

  整数b=100

  system . out . println(a==b);

  //结果为真

  a=200

  b=200

  system . out . println(c==d);

  //结果是假的。原因:=号右边的值赋给了左边的A,B已经是包装类,200不在常量池中。int type 200赋给wrapper类,自动打包的结果为false,因为不在常量池中,所以对象默认为new。

  更多文章和教程,请访问:java语言入门。以上是对java中自动打包和解包的详细了解。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: