java 中Integer型 判断,求高手解

robot1105 2009-04-24 02:38:32
public class Test{

public static void main(String[] args){

Integer t1 = new Integer(127);
Integer t2 = new Integer(127);
System.out.println("t1 == t2 ? " + (t1 == t2));
Integer t3 = 127;
Integer t4 = 127;
System.out.println("t3 == t4 ? " + (t3 == t4));
System.out.println("t1 == t4 ? " + (t1 == t4));
Integer t5 = 128;
Integer t6 = 128;
System.out.println("t5 == t6 ? " + (t5 == t6));
}
}
输出为 false,true,false,false
请问为什么,我只知道第一个false原因,其他的就不了解了

谢谢
...全文
876 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruanpanliang 2009-07-08
  • 打赏
  • 举报
回复
学习中。。
lihbsd 2009-04-24
  • 打赏
  • 举报
回复
学习
robot1105 2009-04-24
  • 打赏
  • 举报
回复
谢谢各位高手了!
sfwhhp 2009-04-24
  • 打赏
  • 举报
回复
学习中,,
jcyan 2009-04-24
  • 打赏
  • 举报
回复
JVM做的改进,Integer在"-128~127"之间的不会创建(new)一个Integer出来,一当超出这范围才会创建
baohui54883 2009-04-24
  • 打赏
  • 举报
回复
最后一个问题:


Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。
至于上面的代码经过编译后就变成了

Integer t5 = Integer.valueOf(128)
Integer t6 = Integer.valueOf(128)
System.out.println("t5 == t6 ? " + (t5 == t6));

看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为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
moolf 2009-04-24
  • 打赏
  • 举报
回复
楼上说的差不多,你可以调试的时候看值的id是怎么变化的,这里涉及到一个常量池的问题,拿t3,t4来说,t3放入的时候放入常量池,当t4也等于127的时候他首先回去常量池中去找,找到了就指向他不会另开辟空间。而至于t5和t6为什么不等,是因为常量池中不是存储所有的数据,在一个数据范围内可以存储,而128超出了这个范围所以就没有把他存储到常量池中,所以他们两个的id是不同的因此是false(以上仅供参考,个人理解)。
robot1105 2009-04-24
  • 打赏
  • 举报
回复
byte型在-127至128,int型在-231 ~ 231-1 (-2147483648~2147483647),怎么integer会是-127~128,怎么回事呢?请再解释下,谢谢。
baohui54883 2009-04-24
  • 打赏
  • 举报
回复
为什么我复制这段代码运行有错误啊?
提示构造函数Ingeger(int)未定义?
goodmrning 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aaa7782814 的回复:]
用new的话就是不会在常量池里查找而是直接分配空间。因此第一个是false
至于t3和t4则是用一个地址,后来定义的t4会查找127并指向t3,因此是true
t1在堆内存,t4在栈内存,因此也是false
最后一个不知道!!高手说说。。
[/Quote]


顶一个!
BeyondDIY 2009-04-24
  • 打赏
  • 举报
回复
Integer的值只能在-128到127之间,其他的用new创建构造一个新分配的 Integer 对象
aaa7782814 2009-04-24
  • 打赏
  • 举报
回复
用new的话就是不会在常量池里查找而是直接分配空间。因此第一个是false
至于t3和t4则是用一个地址,后来定义的t4会查找127并指向t3,因此是true
t1在堆内存,t4在栈内存,因此也是false
最后一个不知道!!高手说说。。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧