JVM優(yōu)化引起的邏輯錯(cuò)誤
- public class Test2 {
- public static void main(String[] args) {
- Integer i1 = 100;
- Integer i2 = 100;
- if (i1 == i2 )
- System.out.println("相等!");
- else
- System.out.println("不相等!");
- }
- }
如上代碼,你覺得會(huì)輸出什么呢?
結(jié)果是“相等”,哈哈,對(duì)象的比較,指向不同的地址,怎么會(huì)相等?
如果修改數(shù)值為256,奇跡出現(xiàn)了,輸出“不相等”
這是因?yàn)閖vm在自動(dòng)裝箱的過程中進(jìn)行了優(yōu)化代碼,在自動(dòng)裝箱時(shí)對(duì)于值從–128到127之間的值,使用一個(gè)實(shí)例。
這樣就造成了邏輯錯(cuò)誤哦。防不勝防??!
可靠一點(diǎn),還是使用如下的初始化對(duì)象方法,這樣,結(jié)果就一直符合邏輯了。
- public class Test2 {
- public static void main(String[] args) {
- Integer i1 = new Integer(100);
- Integer i2 = new Integer(100);
- if (i1 == i2 )
- System.out.println("相等!");
- else
- System.out.println("不相等!");
- }
- }
所以如果進(jìn)行java開發(fā)久了,你就會(huì)比較頭疼那些看上去完全正常的邏輯,在編譯后跑出詭異的結(jié)果來,這完全靠你對(duì)jvm的經(jīng)驗(yàn)積累哦!
原文鏈接:http://www.cnblogs.com/pipelone/archive/2011/08/18/2144795.html
【編輯推薦】