A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 猫腻 于 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

    }

}
两结果不同,为啥,详细点

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油~

查看全部评分

7 个回复

倒序浏览
一激动上题目的标题Integer打错了,请谅解

点评

哈哈,别激动,洒家来了。  发表于 2013-3-13 14:58
回复 使用道具 举报
我如果没记错的话
貌似是-128=<参数<=127之内的数 integer采用的是类似String缓冲池一类的操作
所以v1==v2
范围之外的好像就是2个对象了 所以地址不等

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
Integer在创建对象时,范围在-128~127,就会将值放入缓冲池,供下次引用,否则创建新的对象,虽然W1和W2的值是一样的,但存储的空间不一样,即内存地址不同,所以是false

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址。
回复 使用道具 举报
已解决,莫再回了
回复 使用道具 举报
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


评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1 虽然已解决,但见你回复挺详细,只是格式不.

查看全部评分

回复 使用道具 举报
java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是int V1 = "100",虚拟机认为“100”是常量,放在常量区。下次你再定义String V2 = “100", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”100“,所以用==,都相等,因为值和地址都相等。当取值在-128~127之外,比较的是两个integer对象,两次创建的对象当然不同了。他们存储于堆中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马