Integer是装箱机制哦!去研究下源代码就知道了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); } }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); }
false true true false
Integer A, B; A = new Integer(10); B = new Integer(10); boolean test1 = (A == B); System.out.println(test1); //////////////////////////////////////////// A = 127; B = 127; boolean test3 = (A == B); System.out.println(test3); //////////////////////////////////////////// A = 128; B = 128; boolean test4 = (A == B); System.out.println(test4); //////////////////////////////////////////// int AA = 128; int BB = 128; boolean test5 = (AA == BB); System.out.println(test5); ////////////////////////////////////////////
2楼应该是正解 boolean test2 = (A > B || A == B || A < B); 这里的A == B应该是比较是否指向同一个引用的
对于Integer来说,==比较的是内存地址。 对于int来说,==比较的是值。 A = new Integer(1024); B = new Integer(1024); 很显然,A和B不是同一个对象。如果是这样: A = 128; B = 128; 则与: A = 1000; B = 1000; 效果相同,不是同一个对象。==不成立。但是如果是这样: A = 127; B = 127; 则与: A = 1; B = 1; 效果相同,是同一个对象。==成立。
谢谢提醒,现在好像有点能够讲通了. > 、<适用于数值之间的比较,而==即可用于比较数值简直是否相等也可用于判断对象是否引用同一个对象。 所以: boolean test1 = (A > B || A == B || A < B); 应该被翻译为: boolean test1 = (A.intValue > B.intValue || A == B || A.intValue < B.intValue); 其间因为> 、<适用于数值之间的比较,所以自动进行了拆箱.至于第三条为什么为true大家 应该已经都清楚了
Java 包装类的比较 当我们在利用'=='比较基本类型时,比较的是值 但是==运算符用于比较包装器对象时,是检测对象是否值向同一个存储区域。因此以下的比较通常不成立: Java代码 Integer a = 1000; Integer b = 1000; if(a == b)... 但是Java实现却有可能让它成立:(将1000改为100)Java代码 Integer a = 100; Integer b = 100; if(a == b)... 这是为什么呢? 原来在此处涉及自动打包操作,将int类型自动打包成Integer类型。而自动打包规范要求boolean,byte,char<=127,介于-128~127之间的short和int被包装到固定的对象中,即同一内存区域 。 为避免此类问题,建议使用equals方法比较对象是否相等,而不是用==运算符比较对象是否相同
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);
}
}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);
}
true
true
false
Integer A, B;
A = new Integer(10);
B = new Integer(10);
boolean test1 = (A == B);
System.out.println(test1);
////////////////////////////////////////////
A = 127;
B = 127;
boolean test3 = (A == B);
System.out.println(test3);
////////////////////////////////////////////
A = 128;
B = 128;
boolean test4 = (A == B);
System.out.println(test4);
////////////////////////////////////////////
int AA = 128;
int BB = 128;
boolean test5 = (AA == BB);
System.out.println(test5);
////////////////////////////////////////////
boolean test2 = (A > B || A == B || A < B);
这里的A == B应该是比较是否指向同一个引用的
我也倒了,被这几个符号迷惑了
==比的是内存地址。 而“<”“>”比较的是值,而不是内存地址.test3 4 要看5楼的了,好题目额……
对于int来说,==比较的是值。
A = new Integer(1024);
B = new Integer(1024);
很显然,A和B不是同一个对象。如果是这样:
A = 128;
B = 128;
则与:
A = 1000;
B = 1000;
效果相同,不是同一个对象。==不成立。但是如果是这样:
A = 127;
B = 127;
则与:
A = 1;
B = 1;
效果相同,是同一个对象。==成立。
> 、<适用于数值之间的比较,而==即可用于比较数值简直是否相等也可用于判断对象是否引用同一个对象。
所以:
boolean test1 = (A > B || A == B || A < B);
应该被翻译为:
boolean test1 = (A.intValue > B.intValue || A == B || A.intValue < B.intValue);
其间因为> 、<适用于数值之间的比较,所以自动进行了拆箱.至于第三条为什么为true大家
应该已经都清楚了
Integer a = 1000;
Integer b = 1000;
if(a == b)... 但是Java实现却有可能让它成立:(将1000改为100)Java代码
Integer a = 100;
Integer b = 100;
if(a == b)... 这是为什么呢? 原来在此处涉及自动打包操作,将int类型自动打包成Integer类型。而自动打包规范要求boolean,byte,char<=127,介于-128~127之间的short和int被包装到固定的对象中,即同一内存区域 。 为避免此类问题,建议使用equals方法比较对象是否相等,而不是用==运算符比较对象是否相同