楼主看一下 Integer 的valueOf 的实现public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}Integer 会将127 以内的数字缓存在缓存池中,而大于等于128的数字,则需要new 出来
Integer.valueOf(127) == Integer.valueOf(127); // true
Integer.valueOf(128) == Integer.valueOf(128); // falseInteger num1 = 150;
Integer num2 = 150;
System.out.println(num1 == num2);
这里面涉及拆箱装箱的操作,JVM 先将num1,num2 做个IntegerValueOf() 操作,然后再做 == 比较
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}Integer 会将127 以内的数字缓存在缓存池中,而大于等于128的数字,则需要new 出来
Integer.valueOf(127) == Integer.valueOf(127); // true
Integer.valueOf(128) == Integer.valueOf(128); // falseInteger num1 = 150;
Integer num2 = 150;
System.out.println(num1 == num2);
这里面涉及拆箱装箱的操作,JVM 先将num1,num2 做个IntegerValueOf() 操作,然后再做 == 比较
1.== 比较的是对象的引用
当且仅当比较的两个引用指向同一对象才返回true 。
2.Integer i = XXX
看看Integer 的源代码就知道了,其实就是Integer 把-127-128 之间的每个值都建立了一个对应的Integer 对象,类似一个缓存。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。
Integer i = XXX ,就是Integer i = Interger.valueOf(XXX), 首先判断XXX 是否在-127-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了。
1)对于对象来讲(String,Integer等大写字母开头的类型所定义的对象),除了去判断是否为空(null)可以使用==以及!=以外,尽可能的使用equals来判断值是否相等
2)基本数据类型(char,int等小写字母开头的类型)可以使用==和!=进行安全的判断示例:
package topics_390899847;public class Example {
public static void main(String[] args) {
// 错误、危险的书写方法
Integer a100 = 100;
Integer b100 = 100;
System.out.println("a100 == b100:" + (a100 == b100));
Integer a155 = 155;
Integer b155 = 155;
System.out.println("a155 == b155:" + (a155 == b155)); System.out.println("new Integer(0) == new Integer(0):"
+ (new Integer(0) == new Integer(0))); Integer i = new Integer(0);
Integer j = new Integer(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("new Integer(0).equals(new Integer(0)):"
+ (new Integer(0).equals(new Integer(0))));
}
}
输出:
a100 == b100:true
a155 == b155:false
new Integer(0) == new Integer(0):false
不可思议的走到了这里
a100.equals(b100):true
a155.equals(b155):true
new Integer(0).equals(new Integer(0)):true其中【不可思议的走到了这里】和【什么东西又黑又白又红】一样,
颠覆了大多数程序员的常识……而【new Integer(0) == new Integer(0):false】
又打破了【-127-128 之间的每个值都建立了一个对应的Integer 对象】的神话……建议:
1)推荐阅读《Java 解惑》【Java Puzzles是Effective Java作者写的一本关于Java语言中的一些“陷阱”相关的书】
这次的疑问可以参考【Puzzle 32: Curse of Looper】2)最好用论坛的【代码->Java】来发表问题,这样回复的人很快就能通过复制、粘贴获得代码,不用重新敲一遍了
Java™ Puzzlers: Traps, Pitfalls, and Corner Cases
豆瓣书评【http://book.douban.com/subject/5362860/】C陷阱与缺陷
C Traps and Pitfalls
豆瓣书评【http://book.douban.com/subject/2778632/】这样的书是告诫程序员【不该做什么的书】,
在看完告诉程序员【应该做什么】的《Java核心技术》或者《Java编程思想》之后,
正式书写代码之前,
值得认真阅读没读这本书之前____,读了这本书之后____。
我最喜欢这样的书评了……我自己的真实感觉:
没读这本书之前,觉得自己Java没啥不会的了,
读了这本书之后,觉得后背都是冷汗……