java有装箱和拆箱吗_Java中装箱和拆箱,你真的都懂么?

在给部门做分享的时候,一位同学提问说一直没搞明白Java的装箱和拆箱,让我给讲解下,所以才有了下面这篇文章:

本次文章根据PPT分享整理而成,会有5点:

1、什么是装箱和拆箱?

2、基本数据类型和包装类型区别

3、示例演示

4、示例代码分析

5、总结

1、什么是装箱和拆箱?

概念:

装箱是将基本类型转换为包装类型

拆箱是想包装类型转换为基本类型

示例:

Integer a = new Integer(1); //装箱

int b = a.intVal(); //拆箱

//JDK1.5开始自动装箱和拆箱

Integer a = 1; //自动装箱

int b = a;//自动拆箱

2、基本数据类型和包装类型区别

概念:

基本数据类型:不需要在堆中分配内存,直接将变量的值存储在堆栈上

包装类型:基本数据类型不具有对象的性质,为了让其具有对象性质,故出现包装类型,将基本类型包装,使其具有对象性质

相互转换:

基本数据类型转换为包装类型

Integer.valueOf(int);

...

包装类型转换为基本数据类型

intValue();

longValue();

...

基本类型和包装类型对应关系

基本数据类型

包装类型

byte

Byte

char

Character

short

Short

int

Integer

long

Long

float

Float

double

Double

boolean

Boolean

3、示例演示

// 如果您能全部回答正确,您可以跳过后面章节:

public static void main(String[] args) {

Integer a = 1;

Integer b = 2;

Integer c = 3;

Integer d = 3;

Integer e = 129;

Integer f = 129;

Long g = 3L;

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

System.out.println(e == f);

System.out.println(c == (a+b));

System.out.println(c.equals(a+b));

System.out.println(e.equals(f));

System.out.println(g == (a+b));

System.out.println(g.equals(a+b));

}

4、示例代码分析

// 反编译代码,注意:其中中文注释是我加的,便于大家查看

public static void main(java.lang.String[]);

Code:

0: iconst_1

1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

4: astore_1

5: iconst_2

6: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

9: astore_2

10: iconst_3

11: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

14: astore_3

15: iconst_3

16: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

19: astore 4

21: sipush 129

24: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

27: astore 5

29: sipush 129

32: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

35: astore 6

37: ldc2_w #3 // long 3l

40: invokestatic #5 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;

43: astore 7

45: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

48: aload_3

49: aload 4

51: if_acmpne 58 //c==d,注意这里执行进行了引用比较

54: iconst_1

55: goto 59

58: iconst_0

59: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

62: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

65: aload 5

67: aload 6

69: if_acmpne 76 //e==f,注意这里执行进行了引用比较

72: iconst_1

73: goto 77

76: iconst_0

77: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

80: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

83: aload_3

84: invokevirtual #8 // Method java/lang/Integer.intValue:()I

87: aload_1

88: invokevirtual #8 // Method java/lang/Integer.intValue:()I

91: aload_2

92: invokevirtual #8 // Method java/lang/Integer.intValue:()I

95: iadd // 这里执行了(a+b)

96: if_icmpne 103 // 这里执行c==(a+b),数值比较

99: iconst_1

100: goto 104

103: iconst_0

104: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

107: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

110: aload_3

111: aload_1

112: invokevirtual #8 // Method java/lang/Integer.intValue:()I //拆箱

115: aload_2

116: invokevirtual #8 // Method java/lang/Integer.intValue:()I //拆箱

119: iadd

120: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //装箱

123: invokevirtual #9 // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z //c.equals(a+b)

126: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

129: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

132: aload 5

134: aload 6

136: invokevirtual #9 // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z //e.equals(f)

139: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

142: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

145: aload 7

147: invokevirtual #10 // Method java/lang/Long.longValue:()J //Long 拆箱

150: aload_1

151: invokevirtual #8 // Method java/lang/Integer.intValue:()I //Integer 拆箱

154: aload_2

155: invokevirtual #8 // Method java/lang/Integer.intValue:()I //Integer 拆箱

158: iadd // (a+b)

159: i2l // (a+b)结果转换为long类型

160: lcmp // 执行 g == (a+b) 数值比较

161: ifne 168

164: iconst_1

165: goto 169

168: iconst_0

169: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

172: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;

175: aload 7

177: aload_1

178: invokevirtual #8 // Method java/lang/Integer.intValue:()I //Integer 拆箱

181: aload_2

182: invokevirtual #8 // Method java/lang/Integer.intValue:()I //Integer 拆箱

185: iadd // (a+b)数值相加

186: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; // Integer装箱

189: invokevirtual #11 // Method java/lang/Long.equals:(Ljava/lang/Object;)Z //执行g.equals(a+b)

192: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V

195: return

}

结合反编译代码,给出的分析:

当我们定义Integer a = 1;时实际执行Integer.valueOf(1),返回Integer对象

// 默认IntegerCache.low = -128, IntegerCache.high = 127

// 但是可以指定"java.lang.Integer.IntegerCache.high"

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

当我们给a、b、c和d赋值时,是在-128-127范围内,直接从缓存中取值,而执行e和f赋值时,会执行new Integer(int),所以他们是不同的Integer对象;

"=="符只有遇到运算符才会执行“自动拆箱”

当执行equals比较,会执行类型判断和数值比较

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue();

}

return false;

}

运行结果

c == d:true //没有自动拆箱,直接比较引用

e == f:false //没有自动拆箱,直接比较引用

c == (a+b):true //执行“自动拆箱”,进行数值比较

c.equals(a+b):true //a+b拆箱相加,然后自动装箱,再执行equals

e.equals(f):true //没有执行装箱和拆箱

g == (a+b):true //自动拆箱,执行idd,进行数值比较

g.equals(a+b):false //a+b拆箱相加,然后自动装箱,再执行equals

5、总结

包装类型的数值比较,要注意"=="符号的使用,最好使用equals进行数值比较,因为equals会自动执行拆箱,进行数值比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构-浅谈MySQL数据库优化

主从复制博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1290431 读写分离博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1305083 MySQL-MMM博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1354576 &#xff08;一&#xff09;数据库部…

项目发布相关

1.证书 cer文件需要上传电脑CSR文件&#xff0c;所以其他电脑如需使用需要创建者导出&#xff0c;用于在项目在真机运行或archive的时候签名&#xff0c;Code Signing Identity. 项目App ID&#xff0c;Provisioning Profile只要有管理员权限就可以申请&#xff0c;与cer文件对…

端午随笔

今天是端午节&#xff0c;我也毕业了正式开始了工作生涯&#xff0c;四年的大学生活画上了句号。面临我是什么&#xff0c;我该何去何从。人生的道路已经脱离自己在大学期间的人生规划。新的开始&#xff0c;就要有新的计划。我在一家公司已经实习了三个月了&#xff0c;我是我…

java base64解码出错_Java Base64解码错误及解决方法

问题提出&#xff1a;自己在做一个小网站充当练手&#xff0c;但是前端图片经过base64加密后传往后端在解码。但是一直都有问题&#xff0c;请大神赐教public static string base64toimg(string src) throws ioexception {string uuid uuid.randomuuid().tostring();stringbui…

PPT图片内嵌文字效果

【摘要】在报纸杂志上我们经常看到&#xff0c;有些图片中可以嵌入文字&#xff0c;如下图所示的效果&#xff1a;今天我们一起来学习一下这种效果是怎样生成的。 【正文】以下的操作步骤为PowerPoint 2013版本。 一 插入图片并编辑图片在【插入-联机图片】中搜索需要的图片。…

[天地君亲若追问 枉为知音百年羞]2008.06.07 晃荡在芳华

洞房悄悄静悠悠&#xff0c;花烛高烧暖心头&#xff0c; 喜气阵阵难抑止&#xff0c;这姻缘百折千磨方成啊就。 三月来&#xff0c;屡托刘兄把亲求&#xff0c;每遭见拒愿难酬&#xff0c; 从此我诗书五经无心看&#xff0c;三餐茶饭懒下喉&#xff0c; 日卧书斋愁脉脉&#xf…

[BZOJ1297/Luogu4159][SCOI2009]迷路

题目链接&#xff1a; BZOJ1297 Luogu4159 首先考虑距离只有\(0,1\)的情况 那么如果设\(f[t][i][j]\)表示\(i\)到\(j\)走\(t\)时刻的方案数&#xff0c;有转移方程&#xff1a; \(f[t][i][j]\sum f[t-1][i][k]*f[t-1][j][k]\) 如果把\(f[t]\)看成一个\(n*n\)的矩阵就是\(f[t]f[…

java中的getfirst_Java LinkedList getFirst()用法及代码示例

Java.util.LinkedList.getFirst()方法用于从LinkedList或列表开头的元素中获取或检索第一个元素。用法:LinkedList.getFirst()参数&#xff1a;此方法不带任何参数。返回值&#xff1a;此方法返回第一个元素或列表开头的元素。以下示例程序旨在说明Java.util.LinkedList.getFir…

mybatis数据库数据分页问题

http://www.cnblogs.com/jcli/archive/2011/08/09/2132222.html 借花献佛&#xff0c;天天进步

安装 Windows Server 2008

安装 Windows Server 2008 本文档提供有关安装 Windows Server 2008 操作系统的信息。还提供可以用于解决在安装期间可能出现的问题的信息。 安装过程分为几个阶段。系统将提示您输入一些基本信息&#xff0c;然后&#xff0c;安装程序将复制文件并重新启动计算机。最后&#x…

基于mykernel完成多进程的简单内核

学号351 原创作品转载请注明出处 https://github.com/mengning/linuxkernel/ mykernel简介 mykernel是由孟宁老师建立的一个用于开发您自己的操作系统内核的平台&#xff0c;基于Linux Kernel 3.9.4 source code mykernel的源代码 https://github.com/mengning/mykernel &…

java swing 一闪而过_Java代码,为什么图形会一闪而过,怎么修改?

//未完成&#xff1a;会一闪而过importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.awt.geom.*;publicclassExample17_11extendsFrame{//声明成员变量privatestaticGraph...//未完成&#xff1a;会一闪而过import java.awt.*;import java.awt.event.*;i…

走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)...

架构师是个很神圣的词。盖茨&#xff0c;世界首富。微软&#xff0c;世界最大最富有的软件公司。盖茨是微软的首席架构师。 好多程序员流口水&#xff0c;一听某人是架构师&#xff0c;就两眼发亮&#xff0c;比技术总监的头衔还要厉害。 一想起架构师&#xff0c;大家就想起那…

iOS开发:通过经纬度获得城市、省份等信息

iOS系统自带定位&#xff0c;用CLLocationManager就可以轻松的实现定位的操作&#xff0c;获得的是一组经纬度&#xff0c;当然&#xff0c;也可以根据给出的经纬度获取相应的省份、城市、街道等信息&#xff0c;下面就看一个根据经纬度获得城市的demo&#xff1a;因为获取经纬…

jsonp原理

借助script标签发送跨域请求&#xff0c;只支持get方法 客户端&#xff1a;client.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JSONP 客户端</title> </head> <body><s…

.net内存回收与Dispose﹐Close﹐Finalize方法

一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ FileStream fs这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因…

19、Qt线程(四):继承QRunnable类

一、功能说明 1、通过继承QRunnable&#xff0c;重写run的方式实现多线程 2、点击“开始”按钮启动子线程&#xff1b; 二、项目创建 1、新建Qt Widgets Application应用&#xff0c;名称为Runnable&#xff0c;基类选择QMainWindow&#xff1b; 2、MainWindow.ui中放入一…

JavaScript:学习笔记(9)——Promise对象

JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案&#xff0c;比传统的解决方案回调函数和事件更加合理和强大。如下面为基于回调函数的Ajax操作&#xff1a; request.onreadystatechange function () {if (request.readyState 4) {if (r…

支持java虚拟主机_为何缺乏支持Java的虚拟主机

现在很多站长们&#xff0c;都青睐于香港虚拟主机建站。现在常见的是asp和PHP的程序空间很多&#xff0c;但是Java的少之又少&#xff0c;下面小编我给大家聊一聊&#xff01;一、香港Java虚拟主机成本高使用Java程序建站&#xff0c;就必须要用支持Java程序的香港虚拟主机的了…

C#调用ORACLE存储过程返回结果集及函数

ORACLE段&#xff1a; 首先在ORACLE建立PACKAGE和PACKAGE BODY&#xff0c;将在这里面定义函数和存储过程返回结果集。 1&#xff1a;建立PACKAGE&#xff1a; CREATE OR REPLACE package SCOTT.pk_wt is type mytype is ref cursor; procedure p_wt(mycs out mytype); functio…