java自动包装与解包
2019-05-04 09:40:09来源:博客园 阅读 ()
关于java的自动包装机制想必大家都用过吧,一般这些机制都用于在往容器中存储基本类型数据的时候,因为容器中不允许存在基本数据类型,所以就会调用自动包装机制,将基本数据类型转换为对象,将基本数据保存在对象中,并且提供一些基本方法,但是自动包装机制存在一些陷阱,使用不当就会出错
先看看下面一个例子吧
1 package test; 2 3 public class AutoPack { 4 public static void main(String[] args) { 5 Integer a=1; 6 Integer b=2; 7 Integer c=3; 8 Integer d = 3; 9 Integer e=321; 10 Integer f=321; 11 Long g=3L; 12 System.out.println(c==d);//true 13 System.out.println(e==f);//false 14 System.out.println(c==(a+b));//true 15 System.out.println(c.equals(a+b));//true 16 System.out.println(g==(a+b));//true 17 System.out.println(g.equals(a+b));//false //不是同一类型 18 System.out.println(g.equals((long)(a+b)));//true 首先比较是不是同一类型,再比较值 19 } 20 }
上面例子中的输出你都做对了吗?如果有疑惑,请看我下面的解答
首先我们得请出一个前提:对于对象类型,==符号表示比较对象的所在的物理地址,equals方法比较的是对象的值(前提是两者属于同一个对象类型),而对于基本数据类型,==符号比较的是值
那么对于第一个输出,可能就有点疑惑了,为什么明明是比较对象的地址,却输出了true,而不是false,这里又有一点要补充啦!
因为在jdk实现的时候,考虑到一些对象可能会经常使用,所以在内部创建了一个数组,将常用对象提前做好了创建(Integer是-127~128),要使用的时候,返回的其实是同一个对象,而对于超出范围的值,就会创建一个新的对象啦!
再来看第五个输出,返回了true,这里其实是自动拆包,在包装类的==符号遇到算术运算的时候,就会发生自动拆包,所以比较的是两者的值
那么下面来总结一下:
1.在==运算的时候,如果两端中任何一端含有算术表达式,就会发生自动解包,这时比较的是值
2.在==运算时,两端都没有算术表达式,就不会解包,这时比较的是对象的地址(这样使用很危险)
3.equals可以比较对象的值,比较推荐使用,但前提是要相同对象类型,比如在上面倒数第二个输出中,虽然值相等,但是一个是Integer,一个是Long,就会返回false,但是如果是基本数据类型int 和 long ,他们其实是可以相等的
原文链接:https://www.cnblogs.com/by-my-blog/p/10808057.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash