问题描述
可以解释下为什么吗?
解决方案
解决方案二:
楼主看一下Integer的valueOf的实现publicstaticIntegervalueOf(inti){assertIntegerCache.high>=127;if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}
Integer会将127以内的数字缓存在缓存池中,而大于等于128的数字,则需要new出来Integer.valueOf(127)==Integer.valueOf(127);//trueInteger.valueOf(128)==Integer.valueOf(128);//falseIntegernum1=150;Integernum2=150;System.out.println(num1==num2);这里面涉及拆箱装箱的操作,JVM先将num1,num2做个IntegerValueOf()操作,然后再做==比较
解决方案三:
答案解析:1.==比较的是对象的引用当且仅当比较的两个引用指向同一对象才返回true。2.Integeri=XXX看看Integer的源代码就知道了,其实就是Integer把-127-128之间的每个值都建立了一个对应的Integer对象,类似一个缓存。由于Integer是不可变类,因此这些缓存的Integer对象可以安全的重复使用。Integeri=XXX,就是Integeri=Interger.valueOf(XXX),首先判断XXX是否在-127-127之间,如果是直接return已经存在的对象,否则就只能new一个了。
解决方案四:
在Java语言里:1)对于对象来讲(String,Integer等大写字母开头的类型所定义的对象),除了去判断是否为空(null)可以使用==以及!=以外,尽可能的使用equals来判断值是否相等2)基本数据类型(char,int等小写字母开头的类型)可以使用==和!=进行安全的判断示例:packagetopics_390899847;publicclassExample{publicstaticvoidmain(String[]args){//错误、危险的书写方法Integera100=100;Integerb100=100;System.out.println("a100==b100:"+(a100==b100));Integera155=155;Integerb155=155;System.out.println("a155==b155:"+(a155==b155));System.out.println("newInteger(0)==newInteger(0):"+(newInteger(0)==newInteger(0)));Integeri=newInteger(0);Integerj=newInteger(0);if(i<=j&&j<=i&&i!=j){System.out.println("不可思议的走到了这里");}else{System.out.println("不可思议的居然没走到这里");}//正确、安全的书写方法System.out.println("a100.equals(b100):"+(a100.equals(b100)));System.out.println("a155.equals(b155):"+(a155.equals(b155)));System.out.println("newInteger(0).equals(newInteger(0)):"+(newInteger(0).equals(newInteger(0))));}}
输出:a100==b100:truea155==b155:falsenewInteger(0)==newInteger(0):false不可思议的走到了这里a100.equals(b100):truea155.equals(b155):truenewInteger(0).equals(newInteger(0)):true
其中【不可思议的走到了这里】和【什么东西又黑又白又红】一样,颠覆了大多数程序员的常识……而【newInteger(0)==newInteger(0):false】又打破了【-127-128之间的每个值都建立了一个对应的Integer对象】的神话……建议:1)推荐阅读《Java解惑》【JavaPuzzles是EffectiveJava作者写的一本关于Java语言中的一些“陷阱”相关的书】这次的疑问可以参考【Puzzle32:CurseofLooper】2)最好用论坛的【代码->Java】来发表问题,这样回复的人很快就能通过复制、粘贴获得代码,不用重新敲一遍了
解决方案五:
Java解惑:陷阱、缺陷、犄角旮旯案例【旮旯:9个太阳才能照到的地方】JavaPuzzlers:Traps,Pitfalls,andCornerCases豆瓣书评【http://book.douban.com/subject/5362860/】C陷阱与缺陷CTrapsandPitfalls豆瓣书评【http://book.douban.com/subject/2778632/】这样的书是告诫程序员【不该做什么的书】,在看完告诉程序员【应该做什么】的《Java核心技术》或者《Java编程思想》之后,正式书写代码之前,值得认真阅读没读这本书之前____,读了这本书之后____。我最喜欢这样的书评了……我自己的真实感觉:没读这本书之前,觉得自己Java没啥不会的了,读了这本书之后,觉得后背都是冷汗……
解决方案六:
Integeri=XXX中,XXX会放入常量池中,只不过值要在-127-128之间。
解决方案七:
引用1楼magi1201的回复:
楼主看一下Integer的valueOf的实现publicstaticIntegervalueOf(inti){assertIntegerCache.high>=127;if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}Integer会将127以内的数字缓存在缓存池中,而大于等于128的数字,则需要new出来Integer.valueOf(127)==Integer.valueOf(127);//trueInteger.valueOf(128)==Integer.valueOf(128);//falseIntegernum1=150;Integernum2=150;System.out.println(num1==num2);这里面涉及拆箱装箱的操作,JVM先将num1,num2做个IntegerValueOf()操作,然后再做==比较
跪了,以前只知道引用和拆箱装箱的问题,没想到居然还有这一手