当前位置: 首页 > news >正文

Java 自动装箱与拆箱(Autoboxing and unboxing)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 

一般我们要创建一个类的对象实例的时候,我们会这样:

 Class a = new Class(parameter);

 当我们创建一个Integer对象时,却可以这样:

 Integer i = 100; (注意:不是 int i = 100; )

实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@黑面馒头 和 @MayDayIT 的提醒)

此即基本数据类型的自动装箱功能。

 
  • 基本数据类型与对象的差别 

基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。

基本数据类型没有可调用的方法。

eg:  int t = 1;     t.  后面是没有方法滴。

 Integer t =1; t.  后面就有很多方法可让你调用了。

 
  • 什么时候自动装箱

例如:Integer i = 100;

相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100);

 
  • 什么时候自动拆箱

  自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:

1  Integer i  10 // 装箱 
2    int  t  =  i;  // 拆箱,实际上执行了 int t = i.intValue();

  在进行运算时,也可以进行拆箱。 

1  Integer i  10
2  System.out.println(i ++ );

 

  • Integer的自动装箱

复制代码
//在-128~127 之外的数  Integer i1 =200;  
 Integer i2 =200;          
 System.out.println("i1==i2: "+(i1==i2)); // 在-128~127 之内的数  Integer i3 =100;  
 Integer i4 =100;  
 System.out.println("i3==i4: "+(i3==i4));
复制代码
    输出的结果是:
 i1==i2: false i3==i4: true

 说明:

equals() 比较的是两个对象的值(内容)是否相同。

"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

 

前面说过,int 的自动装箱,是系统执行了 Integer.valueOf(int i),先看看Integer.java的源码:

1
2
3
4
5
6
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}


对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象)

所以范例中,i3 与 i4实际上是指向同一个对象。

而其他值,执行Integer.valueOf(int i) 返回的是一个新建的 Integer对象,所以范例中,i1与i2 指向的是不同的对象。

当然,当不使用自动装箱功能的时候,情况与普通类对象一样,请看下例:

 

1  Integer i3  = new  Integer( 100 ); 
2  Integer i4  = new  Integer( 100 ); 
3  System.out.println( " i3==i4:  " + (i3 == i4)); // 显示false

(感谢易之名的提醒O(∩_∩)O~)

 

  • String 的拆箱装箱

先看个例子:

复制代码
1  String str1  = " abc " ;
2  String str2  = " abc " ;
3  System.out.println(str2 == str1);  // 输出为 true 
4  System.out.println(str2.equals(str1));  // 输出为 true 
5     
6  String str3  = new  String( " abc " );
7  String str4  = new  String( " abc " ); 
8  System.out.println(str3 == str4);  // 输出为 false 
9  System.out.println(str3.equals(str4));  // 输出为 true
复制代码

    这个怎么解释呢?貌似看不出什么。那再看个例子。

1  String d  = " 2 "
2  String e  = " 23 " ;
3  =  e.substring( 0 1 );
4  System.out.println(e.equals(d));  // 输出为 true 
5  System.out.println(e == d);  // 输出为 false
第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。
同理可知,第一个例子中的str3与str4也是各自new了个对象,而str1与str2却是引用了同一个对象。

转载于:https://my.oschina.net/u/204616/blog/548640

相关文章:

  • Java多线程中wait, notify and notifyAll的使用
  • 用Android Studio构建及运行android app
  • ArchSummit北京2015精彩回顾
  • Ubuntu OS应用Runtime Enviroment
  • [转]如何判断js中的数据类型
  • 武汉Uber优步司机奖励政策(12月21日-12.27日)
  • Java基础学习总结(5)——多态
  • 【CURL】PHP的CURL开发项目最佳实践
  • WordPress 全方位优化指南(上)
  • 光播的一些属性设置
  • iOS Swizzle
  • 我的Python 学习之旅 从0开始的小白
  • excel文件怎么使用php进行处理
  • MongoDB常用命令
  • [MFC] VS2013版本MFC工程移植到VC6.0上
  • php的引用
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【React系列】如何构建React应用程序
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 345-反转字符串中的元音字母
  • C++类中的特殊成员函数
  • Docker: 容器互访的三种方式
  • git 常用命令
  • Javascripit类型转换比较那点事儿,双等号(==)
  • select2 取值 遍历 设置默认值
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Travix是如何部署应用程序到Kubernetes上的
  • uni-app项目数字滚动
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 检测对象或数组
  • 利用DataURL技术在网页上显示图片
  • 前端
  • 时间复杂度与空间复杂度分析
  • 算法---两个栈实现一个队列
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信公众号开发小记——5.python微信红包
  • 新书推荐|Windows黑客编程技术详解
  • 译有关态射的一切
  • FaaS 的简单实践
  • puppet连载22:define用法
  • ​批处理文件中的errorlevel用法
  • #mysql 8.0 踩坑日记
  • #单片机(TB6600驱动42步进电机)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (02)vite环境变量配置
  • (4)(4.6) Triducer
  • (Git) gitignore基础使用
  • (ZT)出版业改革:该死的死,该生的生
  • (多级缓存)多级缓存
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计高校学生选课系统
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)【Jmeter】 JMeter的界面布局与组件概述