文档章节

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

ted123
 ted123
发布于 2016/02/16 09:58
字数 887
阅读 10
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

  • 什么是自动装箱拆箱

基本数据类型的自动装箱(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 = 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却是引用了同一个对象。

 

 

 参考:

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 

http://javarevisited.blogspot.com/2012/07/auto-boxing-and-unboxing-in-java-be.html 

© 著作权归作者所有

ted123
粉丝 0
博文 15
码字总数 6236
作品 0
南京
私信 提问
加载中

评论(0)

Java核心(四):Java中的装箱和拆箱

一、为什么需要装箱和拆箱?   基础数据类型是数据,不是对象,也不是Object的子类。Java为每种基本数据类型都提供了对应的包装器类型。装箱就是自动将基本数据类型转换为包装器类型;拆箱...

osc_vy694i16
2019/02/22
6
0
JDK源码阅读-------自学笔记(十)(java.lang.Integer包装类初探)

自动装箱和拆箱 JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing) 自动装箱 基本数据类型在需要时自动转化为对象 自动装箱 对象在需要时自动转化为基本数据类型 注意:   此处的自...

北极的大企鹅
04/19
0
0
Java自动装箱和拆箱,包装类缓存机制和JVM调节

关于Java自动装箱和拆箱 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能 自动装箱,个人感觉也就是为了所谓的java泛型,泛型就是一种糖,装箱是...

BakerZhu
2017/07/17
59
0
Java中包装类与基本类型运算的性能比较(Integer i += 1)

本文主要从字节码和内存占用的角度介绍自动拆箱装箱对运算中性能的影响。 如果要看懂字节码,需要了解JVM的虚拟机栈的结构和代码的执行流程,可参阅《深入理解Java虚拟机》 本文部分参考了如...

TianYuanSX
04/26
0
0
Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较

Autoboxing and Unboxing 总结 关于equals 比较 记住:equals方法比较的是真正的值 double i0 = 0.1;Double i1 = new Double(0.1);Double i2 = new Double(0.1);System.out.println(i1.equa......

osc_hwpd2zko
2019/12/24
2
0

没有更多内容

加载失败,请刷新页面

加载更多

PDF如何添加下划线?迅捷PDF编辑器一键添加

“在PDF文件中如何添加下划线?”最近,很多办公室小伙伴都向小编咨询这样一个问题。我们常常需要接触、使用到PDF文件,通过查看、阅读、编辑PDF文件以处理各种各样的学习、工作任务。当我们...

dawda
2分钟前
0
0
go中gin框架+realize实现边写代码边编译,热更新

最近看到了热加载,相关的,就搜索了goland实现热加载 发现了一个插件realize https://github.com/oxequa/realize 然后,为了自己撸代码更方便,配合gin写个教程 1.准备 go get github.com/...

osc_ho8dcqsx
2分钟前
0
0
CAP理论的理解

转自:https://www.cnblogs.com/mingorun/p/11025538.html CAP理论的理解 CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中: 一致性(Consistency) 可用性(Ava...

osc_5rgbamh9
3分钟前
0
0
求所有科目都大于80分的学生姓名

   蠢蠢的我=》 select t1.name from ( select name,count(*) as num from table t where fenshu>80 group by name) t1join( select name,count(kecheng) as num from table group ......

osc_gk4myeyk
5分钟前
0
0
Memcache(1.1)Memcache 基本概述与架构概述

【1】基本概念介绍 官网:https://memcached.org/ 【1.1】memcache与memcached memcache:是早期使用的,与php结合的,是Php中常用的一个原生插件,完全在php框架内开发的 memcached:是建立...

osc_7ie26pzn
6分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部