參考文章: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操作,並沒有創建大量的對象。