成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

奇怪的Java題:為什么128 == 128返回為False,而127 == 127會(huì)返回為True?

移動(dòng)開發(fā) 移動(dòng)應(yīng)用
我們知道,如果兩個(gè)引用指向同一個(gè)對(duì)象,那么==就成立;反之,如果兩個(gè)引用指向的不是同一個(gè)對(duì)象,那么==就不成立,即便兩個(gè)引用的內(nèi)容是一樣的。因此,結(jié)果就會(huì)出現(xiàn)false。

這是我們今天要討論的話題,因?yàn)槲矣X得它非常的有趣。

如果你運(yùn)行如下代碼: 

  1. class  A 
  2.     public static void main(String[] args)  
  3.     { 
  4.         Integer a = 128, b = 128; 
  5.         System.out.println(a == b); 
  6.         Integer c = 127, d = 127; 
  7.         System.out.println(c == d); 
  8.     } 
  9.  

你會(huì)得到如下結(jié)果:

  1. false 
  2. true  

 

 

運(yùn)行代碼 

我們知道,如果兩個(gè)引用指向同一個(gè)對(duì)象,那么==就成立;反之,如果兩個(gè)引用指向的不是同一個(gè)對(duì)象,那么==就不成立,即便兩個(gè)引用的內(nèi)容是一樣的。因此,結(jié)果就會(huì)出現(xiàn)false。

這是非常有趣的地方。如果你查看Integer.Java類,你會(huì)找到IntegerCache.java這個(gè)內(nèi)部私有類,它為-128到127之間的所有整數(shù)對(duì)象提供緩存。

這個(gè)東西為那些數(shù)值比較小的整數(shù)提供內(nèi)部緩存,當(dāng)進(jìn)行如此聲明時(shí):

  1. Integer c = 127 

它的內(nèi)部就是這樣的:

  1. Integer var3 = Integer.valueOf(127); 

其實(shí)我通過將A.class文件反編譯后,代碼如下圖: 

 

 

將A.class文件反編譯 

如果我們觀察valueOf()類函數(shù),我們可以看到:

  1. public static Integer valueOf(int i) { 
  2.         if (i >= IntegerCache.low && i <= IntegerCache.high) 
  3.             return IntegerCache.cache[i + (-IntegerCache.low)]; 
  4.         return new Integer(i); 
  5.     }  

 

 

 

 

如果值在-128到127之間,它就會(huì)返回該緩存的實(shí)例。

因此。。。

  1. Integer c = 127, d = 127; 

兩者指向同樣的對(duì)象。

這就是為什么下面這段代碼的結(jié)果為true了:

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

現(xiàn)在你可能會(huì)問,為什么會(huì)為-128到127之間的所有整數(shù)設(shè)置緩存?

這是因?yàn)樵谶@個(gè)范圍內(nèi)的小數(shù)值整數(shù)在日常生活中的使用頻率要比其它的大得多,多次使用相同的底層對(duì)象這一特性可以通過該設(shè)置進(jìn)行有效的內(nèi)存優(yōu)化。你可以使用reflection API任意使用這個(gè)功能。

運(yùn)行下面的這段代碼,你就會(huì)明白它的神奇所在了。

  1. public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 
  2.  
  3.       Class cache = Integer.class.getDeclaredClasses()[0];  
  4.       Field myCache = cache.getDeclaredField("cache"); 
  5.       myCache.setAccessible(true); 
  6.  
  7.       Integer[] newCache = (Integer[]) myCache.get(cache);  
  8.       newCache[132] = newCache[133];  
  9.  
  10.       int a = 2; 
  11.       int b = a + a; 
  12.       System.out.printf("%d + %d = %d", a, a, b); // 
  13.     }  

打印結(jié)果竟然是:

  1. 2 + 2 = 5  

 

 

打印結(jié)果 

我們?cè)俅慰匆幌路磪R編代碼: 

 

 

反匯編代碼 

是不是又和上面的是同一個(gè)問題呢?

但是結(jié)果為什么是 2 + 2 = 5 呢?

我們繼續(xù)去看一下 Integer 源碼,去深入了解 Integer 緩存機(jī)制,下面截個(gè)圖: 

 

 

Integer 源碼,去深入了解 Integer 緩存機(jī)制 

根據(jù)源碼可以發(fā)現(xiàn)***修改 Integer 緩存上限時(shí)候的方法有點(diǎn)小瑕疵。我們看看Api給我們?cè)趺唇ㄗh的一段話:

  1. the size of the cache may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option

原來我們只需要:運(yùn)行時(shí)設(shè)置 -XX:AutoBoxCacheMax=133 就OK。

責(zé)任編輯:龐桂玉 來源: Android開發(fā)中文站
相關(guān)推薦

2024-11-15 10:53:56

Java編程語言

2023-01-06 09:11:23

byte取值范圍

2015-11-23 10:09:30

Java

2023-12-20 08:22:29

JavaIntegertrue

2020-07-07 07:37:36

Integer源碼Java

2022-12-22 14:32:37

JavaScript編程語言

2023-05-10 16:15:58

javaScript算法開發(fā)

2021-04-26 14:00:43

Java 數(shù)據(jù)類型

2024-09-11 08:38:02

JavaScriptC#語言編程

2021-05-30 09:25:48

HttpETag 網(wǎng)絡(luò)協(xié)議

2020-08-16 11:29:12

Python函數(shù)開發(fā)

2024-04-23 08:31:57

pythonfalse

2022-06-14 09:52:39

ArrayList初始化容量

2020-03-30 09:00:56

128KB魂斗羅劇情

2023-09-19 08:03:01

JavaScriptevery()

2025-06-12 00:00:00

int (1)int (10)面試

2010-10-25 11:39:16

oracle函數(shù)

2014-03-07 13:29:55

XMLJSON數(shù)據(jù)交換

2024-03-13 10:09:27

機(jī)器人AI模型人工智能

2021-09-07 14:01:39

手機(jī)內(nèi)存技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 四虎网站在线观看 | 综合视频在线 | 中文字幕三区 | 在线观看第一区 | 久久久精品网 | 日韩欧美手机在线 | 一级片在线播放 | 在线观看视频一区 | 高清久久久 | 国产在线精品一区二区 | 日韩在线欧美 | 久久九九影视 | 97精品超碰一区二区三区 | 2019天天操 | 99re在线视频 | 国产精品国产三级国产aⅴ中文 | 韩日一区二区 | 国产精品片aa在线观看 | 国产成人免费视频网站高清观看视频 | 欧美精品区 | av黄色在线观看 | 欧美一区二区三区,视频 | 精品一区二区三区四区五区 | 国产精品久久久亚洲 | 国产a级毛片 | 五月天综合影院 | 午夜精品福利视频 | 国产精品视频久久久 | 人操人免费视频 | 国产在线拍偷自揄拍视频 | 欧美成人一级视频 | 特级毛片www | 狠狠操婷婷 | 色婷婷综合久久久久中文一区二区 | 亚洲www.| 欧美另类视频 | 天天综合网天天综合 | 国产精品成人一区 | 一二区视频 | 亚洲一区电影 | 日韩欧美在线观看 |