中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java修改Integer變量值遇到的問題及解決方法

發布時間:2021-09-17 20:28:18 來源:億速云 閱讀:412 作者:chen 欄目:開發技術

這篇文章主要介紹“Java修改Integer變量值遇到的問題及解決方法”,在日常操作中,相信很多人在Java修改Integer變量值遇到的問題及解決方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java修改Integer變量值遇到的問題及解決方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • Java 修改Integer變量值

    • 下面我嘗試了兩種方法去改變Integer的整型值

    • 看看源碼

  • Integer值比較需要注意的問題

    • 原因

    • 解決辦法

Java 修改Integer變量值

對于Integer變量來說,比較變量值常見情形如下:

Integer a = 1000;  
    Integer b = 1000;  
    Integer c = 100;  
    Integer d = 100;  
    System.out.println(a == b);  
    System.out.println(c == d);

“==”比較的是地址的值,所以正確答案是false,true;

當我們對一個Interger變量直接用“=”號賦值時,相當于自動裝箱,即把右邊的int型變量(整數時默認是int) 轉換成Integer變量,另外我們看看源碼

/** 
         * Returns an {@code Integer} instance representing the specified 
         * {@code int} value.  If a new {@code Integer} instance is not 
         * required, this method should generally be used in preference to 
         * the constructor {@link #Integer(int)}, as this method is likely 
         * to yield significantly better space and time performance by 
         * caching frequently requested values. 
         * 
         * This method will always cache values in the range -128 to 127, 
         * inclusive, and may cache other values outside of this range. 
         * 
         * @param  i an {@code int} value. 
         * @return an {@code Integer} instance representing {@code i}. 
         * @since  1.5 
         */  
        public static Integer valueOf(int i) {  
            assert IntegerCache.high >= 127;  
            if (i >= IntegerCache.low && i <= IntegerCache.high)  
                //當為-128和127之間時,并沒有new一個Integer,而是從緩存中取  
                return IntegerCache.cache[i + (-IntegerCache.low)];  
            return new Integer(i);  
        }

所以說如果int的值為-128到127時,是從常量池里取的Integer變量,所以“c==d”是對的,因為c、d是100

而“a==b”為false,因為他們的值為1000,所以是在堆里new出兩個不同的變量。

這些都很好理解,但是怎么改變Integer的整型值呢?

下面我嘗試了兩種方法去改變Integer的整型值

(1)

有這么一個方法

public void ceshi(Integer integer){
    integer=4444;
}

main方法

Integer shuzi=new Integer(100);
new Test55().ceshi(shuzi);
System.out.println(shuzi);

輸出的結果卻還是100而不是444

再來看看

(2)

main方法

Integer shuzi=new Integer(100);
shuzi=5000;
System.out.println(shuzi);

這回輸出的結果卻又是5000,為什么(1)和(2)都用了“=”號賦值,一個成功,一個卻失敗了?

看看源碼

Integer的源碼:

/**
 * The value of the {@code Integer}.
 *
 * @serial
 */
private final int value;

Integer變量里的value明明就是final變量,照理說是不能夠修改的,那為什么(2)卻成功了?

因為:在(2)的這個情況里,我對它賦值5000,相當于new了一個新的Integer變量,它的value值是5000,然后把這個新的變量賦給“shuzi”這個變量,原來那個value值為100的Integer變量就被覆蓋了,除非我用一個副本保存,不然他就會被GC清除了。

還有一個問題:那為什么(1)改變不了?

因為:我們先要知道,Java 只有值傳遞,只不過值傳遞分為:內存中數值的值傳遞以及內存地址數值的值傳遞,傳遞一個Integer變量參數進去,實際上是構建了一個副本,通過這個副本我們只能去修改原來Integer變量的非final成員變量(假如有的話,也可以是其他類型),上面也說了,如果去修改Integer類型的final變量,那么是會新new一個Integer變量,去覆蓋這個變量副本,所以原來的Integer變量還是原來的,僅僅是“ceshi”這個方法里的副本變量變了,這么理解就清楚了。

Integer值比較需要注意的問題

package com.com.test;
 
/**
 * Created by ***** 2018/6/29 9:18
 * java中Integer類型對于-128-127之間的數是緩沖區取的,
 *  所以用等號比較是一致的。但對于不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。
 */
public class IntegerTest {
    public static void main(String[] args) {
        Integer a1 = Integer.valueOf(60);  //danielinbiti
        Integer b1 = 60;
        System.out.println("1:="+(a1 == b1));  //true
 
 
        Integer a2 = 60;
        Integer b2 = 60;
        System.out.println("2:="+(a2 == b2));   //true
 
 
        Integer a3 = new Integer(60);
        Integer b3 = 60;   // 裝箱過程也就是Integer b3=Integer.valueOf(60)
        System.out.println("3:="+(a3 == b3));    //false
//        System.out.println("3:="+(a3.equals(b3)));   //true
 
        Integer a4 = 129;//大于127時,在堆中新建
        Integer b4 = 129;
        System.out.println("4:="+(a4 == b4));  //false
//        System.out.println("4:="+(a4.equals(b4)));    //true
    }
}

代碼如上所示,運行結果在注釋后。

原因

java中Integer類型對于-128-127之間的數是緩沖區取的,所以用等號比較是一致的。但對于不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。

Integer b3=60,這是一個裝箱過程也就是Integer b3=Integer.valueOf(60)

解決辦法

使用 equals 代替 “==“,即是前者可能在性能上稍遜于后者,但是用后者的話存在bug的可能性。

到此,關于“Java修改Integer變量值遇到的問題及解決方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永康市| 绥中县| 塔城市| 祥云县| 云和县| 淮北市| 建湖县| 轮台县| 沙湾县| 宁德市| 秀山| 潢川县| 安平县| 宁强县| 九江县| 壶关县| 玛沁县| 海伦市| 潢川县| 八宿县| 泊头市| 交口县| 莱州市| 金乡县| 满城县| 北辰区| 阜城县| 红桥区| 外汇| 图木舒克市| 博客| 古蔺县| 乳山市| 固阳县| 若羌县| 开封县| 东海县| 礼泉县| 武义县| 宣汉县| 宜兰县|