亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Java中100==100卻為true,而1000==1000為false的原因

發布時間:2020-11-04 18:22:25 來源:億速云 閱讀:194 作者:Leah 欄目:開發技術

Java中100==100卻為true,而1000==1000為false的原因?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

如果你運行下面的代碼

Integer a = 1000, b = 1000; 
  System.out.println(a == b);//1
  Integer c = 100, d = 100; 
  System.out.println(c == d);//2

你會得到

false
true

基本知識:我們知道,如果兩個引用指向同一個對象,用==表示它們是相等的。如果兩個引用指向不同的對象,用==表示它們是不相等的,即使它們的內容相同。

因此,后面一條語句也應該是false 。

這就是它有趣的地方了。如果你看去看 Integer.java 類,你會發現有一個內部私有類,IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。

所以事情就成了,所有的小整數在內部緩存,然后當我們聲明類似——

Integer c = 100;

的時候,它實際上在內部做的是

Integer i = Integer.valueOf(100);

現在,如果我們去看valueOf()方法,我們可以看到

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

如果值的范圍在-128到127之間,它就從高速緩存返回實例。

所以…

Integer c = 100, d = 100;

指向了同一個對象。

這就是為什么我們寫

System.out.println(c == d);

我們可以得到true。

現在你可能會問,為什么這里需要緩存?

合乎邏輯的理由是,在此范圍內的“小”整數使用率比大整數要高,因此,使用相同的底層對象是有價值的,可以減少潛在的內存占用。

然而,通過反射API你會誤用此功能。

運行下面的代碼,享受它的魅力吧

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

   Class cache = Integer.class.getDeclaredClasses()[0]; //1
   Field myCache = cache.getDeclaredField("cache"); //2
   myCache.setAccessible(true);//3

   Integer[] newCache = (Integer[]) myCache.get(cache); //4
   newCache[132] = newCache[133]; //5

   int a = 2;
   int b = a + a;
   System.out.printf("%d + %d = %d", a, a, b); //
  }

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

城步| 会宁县| 德州市| 新野县| 思茅市| 沾益县| 兴安县| 铅山县| 安泽县| 海阳市| 娄烦县| 六盘水市| 平潭县| 集安市| 屯门区| 新疆| 安吉县| 天津市| 安陆市| 肥乡县| 万载县| 青川县| 闻喜县| 石城县| 鱼台县| 合山市| 安顺市| 饶平县| 柳州市| 嘉定区| 恩施市| 烟台市| 铁力市| 江西省| 怀远县| 桦南县| 斗六市| 易门县| 萍乡市| 秦安县| 桓台县|