java中的自動裝箱和拆箱

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章