全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java 装箱与拆箱详解及实例代码

Java 装箱与拆箱详解

前言:

要理解装箱和拆箱的概念,就要理解Java数据类型

装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float

拆箱:和装箱相反,将引用类型的对象简化成值类型的数据

Integer a = 100;         这是自动装箱 (编译器调用的是static Integer valueOf(int i))
int   b = new Integer(100); 这是自动拆箱

看下面一段代码

m1

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m11();
    dt.m12();
     
  }
 
  public void m11() {
    Integer a = new Integer(100);
    Integer b = 100;
    System.out.println("m11 result " + (a == b));
  }
 
  public void m12() {
    Integer a = new Integer(128);
    Integer b = 128;
    System.out.println("m12 result " + (a == b));
  }
 
   
}

  打印结果是什么?

m11 result false
m12 result false

“==”比较的是地址,而a和b两个对象的地址不同,即是两个对象,所以都是false

通过javap解析字节码,内容如下

public void m11();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  bipush 100
  6:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  9:  astore_1
  10: bipush 100
  12: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  15: astore_2
  16: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  19: new   #59; //class java/lang/StringBuilder
  22: dup
  23: ldc   #61; //String m11 result
  25: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  28: aload_1
  29: aload_2
  30: if_acmpne    37
  33: iconst_1
  34: goto  38
  37: iconst_0
  38: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  41: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  44: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  47: return
 
public void m12();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  sipush 128
  7:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  10: astore_1
  11: sipush 128
  14: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  17: astore_2
  18: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  21: new   #59; //class java/lang/StringBuilder
  24: dup
  25: ldc   #82; //String m12 result
  27: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  30: aload_1
  31: aload_2
  32: if_acmpne    39
  35: iconst_1
  36: goto  40
  39: iconst_0
  40: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  43: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  46: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  49: return
</init></init></init></init>
 

m2

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m21();
    dt.m22();
  }
 
  public void m21() {
    Integer a = new Integer(100);
    Integer b = new Integer(100);
    System.out.println("m21 result " + (a == b));
  }
 
  public void m22() {
    Integer a = new Integer(128);
    Integer b = new Integer(128);
    System.out.println("m22 result " + (a == b));
  }
 
   
}

  打印结果是

m21 result false
m22 result false

a和b仍是两个对象

javap解析内容

public void m21();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  bipush 100
  6:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  9:  astore_1
  10: new   #44; //class java/lang/Integer
  13: dup
  14: bipush 100
  16: invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  19: astore_2
  20: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  23: new   #59; //class java/lang/StringBuilder
  26: dup
  27: ldc   #84; //String m21 result
  29: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  32: aload_1
  33: aload_2
  34: if_acmpne    41
  37: iconst_1
  38: goto  42
  41: iconst_0
  42: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  45: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  48: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  51: return

public void m22();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  sipush 128
  7:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  10: astore_1
  11: new   #44; //class java/lang/Integer
  14: dup
  15: sipush 128
  18: invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  21: astore_2
  22: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  25: new   #59; //class java/lang/StringBuilder
  28: dup
  29: ldc   #86; //String m22 result
  31: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  34: aload_1
  35: aload_2
  36: if_acmpne    43
  39: iconst_1
  40: goto  44
  43: iconst_0
  44: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  47: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  50: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  53: return

m3

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m31();
    dt.m32();
  }
 
  public void m31() {
    Integer a = 100;
    Integer b = 100;
    System.out.println("m31 result " + (a == b));
  }
 
  public void m32() {
    Integer a = 128;
    Integer b = 128;
    System.out.println("m32 result " + (a == b));
  }
 
 
}

  打印结果

m31 result true
m32 result false

为什么有第一个是true,第二个是false呢?观察javap解析的数据

javap解析内容

public void m31();
 Code:
  0:  bipush 100
  2:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  5:  astore_1
  6:  bipush 100
  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  11: astore_2
  12: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  15: new   #59; //class java/lang/StringBuilder
  18: dup
  19: ldc   #88; //String m31 result
  21: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  24: aload_1
  25: aload_2
  26: if_acmpne    33
  29: iconst_1
  30: goto  34
  33: iconst_0
  34: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  43: return

public void m32();
 Code:
  0:  sipush 128
  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  6:  astore_1
  7:  sipush 128
  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  13: astore_2
  14: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  17: new   #59; //class java/lang/StringBuilder
  20: dup
  21: ldc   #90; //String m32 result
  23: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  26: aload_1
  27: aload_2
  28: if_acmpne    35
  31: iconst_1
  32: goto  36
  35: iconst_0
  36: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  45: return

m4

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m41();
    dt.m42();
  }
 
 
  public void m41() {
    Integer a = Integer.valueOf(100);
    Integer b = 100;
    System.out.println("m41 result " + (a == b));
  }
   
  public void m42() {
    Integer a = Integer.valueOf(128);
    Integer b = 128;
    System.out.println("m42 result " + (a == b));
  }
}

  打印结果

m41 result true
m42 result false

javap解析内容

public void m41();
 Code:
  0:  bipush 100
  2:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  5:  astore_1
  6:  bipush 100
  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  11: astore_2
  12: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  15: new   #59; //class java/lang/StringBuilder
  18: dup
  19: ldc   #92; //String m41 result
  21: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  24: aload_1
  25: aload_2
  26: if_acmpne    33
  29: iconst_1
  30: goto  34
  33: iconst_0
  34: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  43: return

public void m42();
 Code:
  0:  sipush 128
  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  6:  astore_1
  7:  sipush 128
  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  13: astore_2
  14: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  17: new   #59; //class java/lang/StringBuilder
  20: dup
  21: ldc   #94; //String m42 result
  23: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  26: aload_1
  27: aload_2
  28: if_acmpne    35
  31: iconst_1
  32: goto  36
  35: iconst_0
  36: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  45: return

}

分析

javap是Java自带的一个工具,可以反编译,也可以查看Java编译器生成的字节码(上面代码只使用了javap -c DataType),是分析代码的一个好工具,具体怎么使用请Google一下

先看一下m4,为什么运行结果中出现了“true”呢,true说明a、b是同一个对象。 

但a对象是调用Integer.valueOf()生成的,b是通过自动装箱生成的对象,为什么会是同一个对象呢?再看一下字节码吧,毕竟Java程序是依靠虚拟机运行字节码实现的。

m41这个方法只适用了一次valueOf(),但字节码中出现了两次,说明自动装箱时也调用了valueOf()。

下面是valueOf()具体实现

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since 1.5
 */
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache 
  return IntegerCache.cache[i + offset];
}
  return new Integer(i);
}

在【-128,127】之间的数字,valueOf返回的是缓存中的对象,所以两次调用返回的是同一个对象。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java  # 装箱与拆箱  # 装箱与拆箱详解  # 装箱与拆箱简单实例  # java自动装箱拆箱深入剖析  # 详解Java 自动装箱与拆箱的实现原理  # Java中的装箱和拆箱深入理解  # 浅谈Java自动装箱与拆箱及其陷阱  # 详解Java包装类及自动装箱拆箱  # java编程中自动拆箱与自动装箱详解  # Java实现拆箱和装箱的原理解析  # Java中自动装箱、拆箱引起的耗时详解  # 深入理解Java中的装箱和拆箱  # 详细说一说Java自动装箱与拆箱是什么  # 的是  # 这是  # 两次  # 出现了  # 都是  # 第一个  # 希望能  # 第二个  # 仍是  # 使其  # 再看  # 即是  # 自带  # 谢谢大家  # 用它  # 先看  # 可以查看  # 反编译  # 使用了  # 结果是 


相关文章: 太原网站制作公司有哪些,网约车营运证查询官网?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  简单实现Android文件上传  如何在IIS7中新建站点?详细步骤解析  如何快速搭建支持数据库操作的智能建站平台?  一键网站制作软件,义乌购一件代发流程?  网站企业制作流程,用什么语言做企业网站比较好?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在万网自助建站平台快速创建网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  重庆市网站制作公司,重庆招聘网站哪个好?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  定制建站哪家更专业可靠?推荐榜单揭晓  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站之星ASP如何实现CMS高效搭建与安全管理?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  如何在局域网内绑定自建网站域名?  小型网站制作HTML,*游戏网站怎么搭建?  建站之星如何优化SEO以实现高效排名?  建站之星代理费用多少?最新价格详情介绍  IOS倒计时设置UIButton标题title的抖动问题  岳西云建站教程与模板下载_一站式快速建站系统操作指南  已有域名和空间如何搭建网站?  ,想在网上投简历,哪几个网站比较好?  实现虚拟支付需哪些建站技术支撑?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  Android自定义控件实现温度旋转按钮效果  宝塔Windows建站如何避免显示默认IIS页面?  如何通过商城免费建站系统源码自定义网站主题?  如何通过老薛主机一键快速建站?  如何在阿里云高效完成企业建站全流程?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  建站之星好吗?新手能否轻松上手建站?  宝塔新建站点为何无法访问?如何排查?  企业微网站怎么做,公司网站和公众号有什么区别?  电商平台网站制作流程,电商网站如何制作?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  建站之星北京办公室:智能建站系统与小程序生成方案解析  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何用花生壳三步快速搭建专属网站?  建站VPS能否同时实现高效与安全翻墙?  如何在腾讯云免费申请建站?  网站制作公司排行榜,抖音怎样做个人官方网站  建站之星如何通过成品分离优化网站效率?  建站之星如何开启自定义404页面避免用户流失?  音响网站制作视频教程,隆霸音响官方网站?  如何用IIS7快速搭建并优化网站站点?  网站图片在线制作软件,怎么在图片上做链接?  非常酷的网站设计制作软件,酷培ai教育官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。