文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java自动拆装箱的示例分析

2023-05-31 00:58

关注

这篇文章将为大家详细讲解有关Java自动拆装箱的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、拆装箱概念

所谓的拆装箱,就是自从JDK1.5之后,java的基本类型和引用类型之间的相互转换。

1拆箱

拆箱就是把Long,Integer,Double,Float 等将基本数据类型的首字母大写的相应的引用类型转化为基本数据类型的动作就叫拆箱。

2装箱

装箱就是把byte ,int ,short, long ,double,float,boolean,char 这些Java的基本数据类型在定义数据类型时不声明为相对应的引用类型,在编译器的处理下自动转化为引用类型的动作就叫做装箱。

二、拆装箱的相关应用

在JDK1.5后,当我们进行基本类型和引用类型的转换的时候就会方便:

package com.hzp.CZX;public class TestDemo {    public static void first(){    Integer i=7;//基本类型-->引用类型    int j=i;//引用类型-->基本类型    System.out.println(j);  }    public static void second(){    Integer i=new Integer(78);    int j=i.intValue();    System.out.println(j);  }    public static void main(String[] args) {    first();    second();  }}

上面介绍了关于拆装箱的一些基本点和使用方式,但是要使用拆装箱的话还有一些注意点需要注意,下面将这些注意点进行一些总结。

三、注意点

首先贴一段代码如下:

package com.ygh.CZX;public class Test {    public static void first(){    Integer i=new Integer(124);    Integer j=new Integer(124);    System.out.println(i==j);//false    Integer a1=-128;    Integer a2=-128;    System.out.println(a1==a2);//true    Integer b1=-129;    Integer b2=-129;    System.out.println(b1==b2);//false    Integer c1=127;    Integer c2=127;    System.out.println(c1==c2);//true    Integer d1=128;    Integer d2=128;    System.out.println(d1==d2);//false  }  public static void main(String[] args) {    first();      }}

简单解释一下:

第一个结果为false的原因是因为创建了不同的对象,所以两者不一样;

但是第二个和第三个的结果为什么不一样?

下面贴出关于Integer类的源码,从源码的角度来分析这个问题:

    public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)      return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);  }

上面的代码是说,进行自动拆装箱的时候,是有一个范围的,一旦超出这个范围,那么指向的就不是同一个对象,而是返回一个新创建的对象了,这个范围在Integer类中的一个内部私有类IntegerCache可以体现出来,源码如下:

 private static class IntegerCache {    static final int low = -128;    static final int high;    static final Integer cache[];    static {      // high value may be configured by property      int h = 127;      String integerCacheHighPropValue =        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");      if (integerCacheHighPropValue != null) {        try {          int i = parseInt(integerCacheHighPropValue);          i = Math.max(i, 127);          // Maximum array size is Integer.MAX_VALUE          h = Math.min(i, Integer.MAX_VALUE - (-low) -1);        } catch( NumberFormatException nfe) {          // If the property cannot be parsed into an int, ignore it.        }      }      high = h;      cache = new Integer[(high - low) + 1];      int j = low;      for(int k = 0; k < cache.length; k++)        cache[k] = new Integer(j++);      // range [-128, 127] must be interned (JLS7 5.1.7)      assert IntegerCache.high >= 127;    }    private IntegerCache() {}  }

从这里我们可以看出,范围值为[-128,127]之间。

注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。

总结:这些进行自动拆装箱的基本类型的范围如下:

boolean类型的值

所有的byte的值

在-128~127的short类型的值

在-128~127的int类型的值

在\ u0000~\ u00ff 之间的char类型的值

而其中double和float又有所不同,我们就以double为例子,贴出代码讨论:

package com.ygh.CZX;public class Test {    public static void first() {    Double i1 = 100.0;    Double i2 = 100.0;    Double i3 = 200.0;    Double i4 = 200.0;    System.out.println(i1 == i2);//false    System.out.println(i3 == i4);//false  }    public static void main(String[] args) {    first();  }}

注意为什么上面的代码的输出结果都是false呢?同样的我们依旧以Double类中的valueOf方法来讨论,贴出源码就一目了然了:

    public static Double valueOf(double d) {    return new Double(d);  }

也就是说不管你的double是什么范围的值,他都是给你返回一个新的对象。float同double,就不过多赘述了。

关于“Java自动拆装箱的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯