参考文章:https://droidyue.com/blog/2015/04/07/autoboxing-and-autounboxing-in-java/
基本数据类型 | 封装类型 |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
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操作,并没有创建大量的对象。