運行下面這段代碼:
System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); System.out.println(Integer.valueOf("128")==Integer.valueOf("128")); System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
JDK1.6輸出結果:
false false true
JDk1.7輸出結果:
true false true
下面來研究一下為什么會出現這種情況。
JDk1.7中Integer源碼中valueOf方法:
第一步:
第二步:
第三步:
可以發現,valueOf會返回一個Integer(整型)對象,當被處理的字符串在-128和127(包含邊界)之間時,返回的對象是預先緩存的。
可以得出:
第一行的調用返回true,這個整型對象127是被緩存的
第二行的調用返回false是因為128沒有被緩存。
JDk1.6中Integer源碼中valueOf方法:
第一步:
第二步:
可以發現,valueOf無論大小都會返回一個new 的 新的Integer(整型)對象,所以都不一樣。
可以得出:
第一行的調用返回false,返回一個新的Integer(整型)對象
第二行的調用返回false,,返回一個新的Integer(整型)對象。
第三行的方法Integer.parseInt(String),這個方法反回的int
對應的Integer源碼如下:
比較操作符使用了==同時等號的兩邊存在一個int型和一個Integer對象的引用時,Java在進行比較前會將Integer自動拆箱,所以最后進行的是int和int值之間的比較。
即:128==128,返回true。
小結:JDK1.7版本開始,Integer有了靜態緩存,這點注意一下。