黑马程序员技术交流社区
标题:
同样是Ingter定义的变量比较为啥会产生两个不同的结果?
[打印本页]
作者:
张善颖
时间:
2013-3-13 14:13
标题:
同样是Ingter定义的变量比较为啥会产生两个不同的结果?
本帖最后由 猫腻 于 2013-3-13 14:59 编辑
public class a{
public static void main(String[] args){
Integer v1=100;
Integer v2=100;
System.out.println(v1==v2); //输出:true
Integer w1=200;
Integer w2=200;
System.out.println(w1==w2); //输出:false
}
}
两结果不同,为啥,详细点
作者:
张善颖
时间:
2013-3-13 14:14
一激动上题目的标题Integer打错了,请谅解
作者:
HM李帅
时间:
2013-3-13 14:27
我如果没记错的话
貌似是-128=<参数<=127之内的数 integer采用的是类似String缓冲池一类的操作
所以v1==v2
范围之外的好像就是2个对象了 所以地址不等
作者:
wanggang
时间:
2013-3-13 14:34
Integer在创建对象时,范围在-128~127,就会将值放入缓冲池,供下次引用,否则创建新的对象,虽然W1和W2的值是一样的,但存储的空间不一样,即内存地址不同,所以是false
作者:
冷叙辰
时间:
2013-3-13 14:39
当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址。
作者:
张善颖
时间:
2013-3-13 14:49
已解决,莫再回了
作者:
疯狂程序
时间:
2013-3-13 14:50
Integer存储在堆中,相应于int的类类型,称为对象包装,其实上述的Integer w1=200; Integer w2=200;可以写成 Integer w1= new Integer(200); Integer w2 = new Integer(200);当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法
Integer的封装
,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);
}
可见Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,
所以v1,v2在范围内,调用valueOf,结果为true,w1,w2结果为false
作者:
奋斗2013
时间:
2013-3-13 15:03
java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是int V1 = "100",虚拟机认为“100”是常量,放在常量区。下次你再定义String V2 = “100", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”100“,所以用==,都相等,因为值和地址都相等。当取值在-128~127之外,比较的是两个integer对象,两次创建的对象当然不同了。他们存储于堆中。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2