刚刚有个问题有点困惑Integer x = 100;
Integer y = 100;
System.out.println(x == y);结果是ture如果吧x和y 的值改成 大于127的结果又是false。 这是什么原理啊??
Integer y = 100;
System.out.println(x == y);结果是ture如果吧x和y 的值改成 大于127的结果又是false。 这是什么原理啊??
调试欢乐多
如果范围是在-128到127之间,直接返回的是int所以比较地址
如果在这个范围外,就返回Integer,是对象了
你也可以用比-128小的数字比较久知道了
当超出这个范围的时候,作为引用类型,则是去比较它们的内存地址,对应的
的内存地址里面的内容相等,但地址却不等。
这是java编译器定义的,是为方便使用
一般我用if判断两个数不能==之后都是直接equal的...
呵呵 尤其是String。。
但是原因不知道....
/*
* 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则
* 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过
* 缓存经常请求的值而显著提高空间和时间性能。
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @since 1.5
*/
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
/*
* IntegerCache内部类
* 其中cache[]数组用于存放从-128到127一共256个整数
*/
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
首先:
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
返回的是IntegerCache中的静态数组cache. 而这个数组中的每一个元素都是Integer类型的,怎么从很多人口里就成了int类型的呢。实际上:Integer i=100; -> Integer i=Integer.valueOf(100) -> Integer i= IntegerCache.cache[228]
也就是说Integer引用i中存储的是IntegerCache中Integer数组中的第228个元素的地址。 而不是你们说的什么值比较。 另外, Integer j=100; 那么j存储的也是这个地址。因为cache数组是IntegerCache类的静态数组,唯一的一个。因此i==j 仍然是比较地址,也就相等了。不是什么在值比较。至于Integer i=200; -> Integer i=Integer.valueOf(100) -> Integer i= new Integer(200);
Integer j=200; -> .... ->Integer j=new Integer(200);这个大家就都知道了,就是i,j存储的是堆中的两个Integer对象的地址。i==j 就不等了。http://hxraid.javaeye.com/blog/614440
如果是Object想比较是否相等,应该用equals而不是用==。如果是兴趣爱好想钻研,就的确是应该像楼上的那样去看源码最合适。
Ieteger是对int的封装
如果范围是在-128到127之间,直接返回的是int所以比较地址