java 之装箱与拆箱的研究总结

今天看java JDK7的新特新语法糖的时候突然有提到装箱与拆箱,就特地加深一下:

所谓装箱:就是在代码编译期将基本类型转化为包装类型,使其基本有类型具有对象特征

所谓拆箱:与装箱过程相反,就是把包装类型转为基本类型 

自动装箱/拆箱 就是代码在编译根据代码的语法,决定是否装箱或者拆箱!

一:先说说equals()和== 号的区别吧!

Integer,short的自动装箱:


		Integer a = -129; //超出-128
		Integer b = -129;
		Integer c=1;
		Integer d=1;
		System.out.println(c==d);
		System.out.println(a==b);

输出结果为:false,true。也就是说:

1:自动装箱针对于值-128~127之间,他们被装箱后会在内存中被重用!如果超过了这个区间那么就不会被重用,也就相当于每次新建一个Integer 的对象!

再来说说equals()和== 号的区别吧:


		Integer a = -129;
		Integer b = -129;
		System.out.println(a.equals(b)); 
		System.out.println(a==b); //地址未被重用
输出结果为:true false

说明:

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

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

String、的装箱与拆箱

 	   String str1 = "abc";
           String str2 = "abc";
           System.out.println(str2==str1);  //输出为 true 
           System.out.println(str2.equals(str1));  //输出为 true 
             
           String str3 = new String("abc");
           String str4 = new String("abc"); 
           System.out.println(str3==str4);  //输出为 false 
           System.out.println(str3.equals(str4));  //输出为 true
可以看出来 str1 str2引用的是同一对象,str3 str4却是俩个不同的对象


注意:Integer i=3; 事实上调用的Integer.valueOf(int i);   装箱是Integer.valueOf(int i),那么拆箱是:i.intValue()!


需要注意的是:

包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:

Integer a = 1;  
Integer b = 1;  
Long c = 1L;  
System.out.println(a == b);  
System.out.println(c.equals(a));  
这样的代码是有误区的, 根本不会实现拆装箱的操作! 这样的代码应该尽量避免自动拆箱与装箱。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值