java中的自动装箱和拆箱

参考文章:https://droidyue.com/blog/2015/04/07/autoboxing-and-autounboxing-in-java/

 

                    

基本数据类型封装类型
byteByte
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

1.基本类型->封装类(装箱)

调用相应封装累的valueOf()方法

eg:

      int i=10;      
      Integer j = Integer.valueOf(i);

2.封装类-基本数据类型

调用相应封装类型的xxxValue()方法

eg:

Integer i=10;
int j=i.intValue();

3.使用正确类型声明变量

eg:

Integer i=0;
for(int j=0;j<100;j++){
    i+=j;
}

由于封装类型不能进行运算,所以上面的代码在编译的时候要进行以下操作

Integer i=130;//(-128~127)
for(int j=0;j<100;j++){
    int result=i.intValue()+1;
    Integer i = new Integer(result);
}

这里会在堆内存中创建将近100个没用的Integer对象,如果循环次数过大的话,会降低程序的性能,加重垃圾回收工作。

所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作。

 

4.心心想念的字符串拼接。

4.1几个字符串相加

public class StrTest{
	
	public static void main(String [] args){
		String a ="1234";
		String b = "5678";
		String c ="abcd";

		String result = a+b+c; // 等同于 “1234”+“5678”+“abcd”
		System.out.print(result);
	}
}

利用javap -c StrTest 反编译,查出最后存在字符串常量池中的数据只用“12345678abcd”,而不是“12345678”和 “12345678abcd”

4.2循环获取字符串

public class StrTest{
	
	public static void main(String [] args){
		String a ="1234";
		for(int i=0;i<100;i++){
			a+=i;
		}
		System.out.print(a);
	}
}

可以看出圈红的地方是循环的位置,此时创建了100个StringBuilder对象,造成了堆内存的负担。

4.3进行改造

public class StrTest{
	
	public static void main(String [] args){
		StringBuilder a =new StringBuilder("1234");
		for(int i=0;i<100;i++){
			a.append(i);
		}
		System.out.print(a);
	}
}

 

可以看出,此时循环内只做了append操作,并没有创建大量的对象。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值