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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侠客梦的懒猫 中级黑马   /  2013-12-9 20:34  /  1449 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

         Integer a=137;
         System.out.println("数字:"+a);
         
         Integer b=137;
         System.out.println("数字:"+b);
         System.out.println(a==b);
为什么输出的是false,是不是虽然这个值相同,但是他们是不同的对象呢?还是不太明白,求解释:)!先谢谢哦!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

6 个回复

倒序浏览
1. int类型是一种基本数据类型,其变量是放在栈内存中的。Integer是对应于int的类类型,称为对象包装,其实例是放在堆内存中的。Integer包装类的出现是为了提供关于int基本数据类型的一些方法,比如进制转换,其与字符串基本数据类型的转换等。
2. a==b的返回值是false,但a.equals(b)的返回值是true。a, b作为整形包装类的对象,==操作符的意义是比较两个对象的引用是否相同。而这两个对象的equals()方法继承于Object类,意义是比较两个对象的引用指向的对象是否相同。
3.  从内存分配的角度理解,==针对的是存储于栈内存中的引用,equals()方法针对的是存储于堆内存中的对象内容。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Jim-剣◆﹏ 于 2013-12-9 22:02 编辑

Integer类用的是享元模式
数值在-128~+127之间的值,所指向的就是同一个对象
如果不在这个范围之内,即使数值相同,对象也不是指同一个
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-9 21:01
Integer类用的是享元模式
数值在-128~+128之间的值,所指向的就是同一个对象
如果不在这个范围之内,即使数 ...

+127吧?
回复 使用道具 举报
本帖最后由 刘敏 于 2013-12-9 21:39 编辑

Java虚拟机 默认给Integer在常量区给出了-128~127的值,当两个Integer的对象值在这个范围内的时候,比如110,这两个对象引用都指向常量区110的地址;但当对象的值超过127,比如150 的时候,就需要在堆上新new 两个值为150 的对象,这时候 对象引用的值就分别指向堆上的两个地址了。总的来说,在-128~127,Integer的引用都指向常量区,超过就要在堆上new对象。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报

:lol手快打错,谢谢提醒
回复 使用道具 举报
懂了,谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马