Integer的一些思考

題目:

Integer a = 18;
Integer b = 19;
System.out.println("交換前a:" + a + "--->b:" + b);
swap(a, b);
System.out.println("交換後a:" + a + "--->b:" + b);

 初步思路:

         1、java傳參如果傳基本類型,操作不改變原數值,傳對象,操作會改變包裝類型

         2、Integer內有常數數組[-128-127]之間的數都是常數

初步結論:

         當Integer的值在常數數組內時,交換不改變原值,不在數組內時會發生改變

實驗:結果很尷尬

思考:

      

其實方法的傳參(封裝類對象),實際上是在方法中重新創建了一個對象,並指向傳進來的參數對應的內存地址。

如:將對象A傳到方法中充當參數A,實際上參數A和對象A是兩個不同的對象,只不過是指向了同一個內存地址,更改後的數據會直接寫入到內存地址中,所以對象傳參會更改原有的值。

Integer相關:

     Integer a = *;實際上是Integer a = Integer.valueOf(*);

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 當*不在[-128-127]之間時,Integer a = *;相當於Integer a = new Integer(*);

前面有說對象傳參實際上是修改了內存地址上的數據,雖然new Integer也對應了一個內存地址,但是它內部的屬性是final的,無法被更改,也就是說這個內存地址裏的東西沒法改動,你在方法裏的修改相當於重新指向了一塊新的地址,對原地址的數據毫無影響。

 

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