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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wodeairenw 中级黑马   /  2013-3-11 14:30  /  1503 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wodeairenw 于 2013-3-11 15:36 编辑

  1. class zijiwenti2
  2. {
  3. public static void main(String[] args)
  4. {
  5.   Integer h = new Integer(100);
  6.   Integer a = new Integer(100);
  7.   Integer b = 100;
  8.   Integer c = 100;
  9.   System.out.println(a==h);//false,这是为什么?
  10.   System.out.println(b==c);//ture,1.5后新特性,当数值在byte范围内,视两个同一对象。
  11. }
  12. }
  13. 为什么下面一个是true,上面一个是false,照1.5新特性的话上面一个也应该相等的啊
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

4 个回复

倒序浏览
"=="作为基本类型数据时比较的是值,而作为引用类型数据时,比较的是地址值,
A和H在堆内存中各自己创建了一个新对象,虽然它们都是指向常量池中的“100”值,但它们堆内存不是一个,返回的自然也就是假了
回复 使用道具 举报
邹学良 发表于 2013-3-11 14:41
"=="作为基本类型数据时比较的是值,而作为引用类型数据时,比较的是地址值,
A和H在堆内存中各自己创建了 ...

你没明白我的意思,就是为什么下面一个是true上面一个是false,照1.5新特性的话上面一个也应该相等的啊。
回复 使用道具 举报
  1. class zijiwenti2
  2. {
  3. public static void main(String[] args)
  4. {
  5.   Integer h = new Integer(100);
  6.   Integer a = new Integer(100);
  7.   Integer b = 100;
  8.   Integer c = 100;
  9.   System.out.println(a==h);//这里比较的是两个对象的地址,new了两个对象,开辟了两个不同的空间,所以这两个空间的地址当然不一样了,
  10.                                       //只是这两个对象里边的值都指向的是常量池里边的 100.
  11.   System.out.println(b==c);//Integer类的内部, 有一个常量静态数组, 在Integer类被加载的时候, 预先创建了-128 ~ 127的Integer对象, 所以当声明的Integer类型变量的值在-128 ~ 127的范围内时, 不会新创建对象, 直接引用数组中创建好的。所以这两个都直接饮用的是Integer内部的100.所以相等。
  12. }
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 邹学良 于 2013-3-11 15:07 编辑
wodeairenw 发表于 2013-3-11 14:55
你没明白我的意思,就是为什么下面一个是true上面一个是false,照1.5新特性的话上面一个也应该相等的啊。 ...


A和H只是一个对Integer在常量池中“100”数字的引用,就像两个人都去北京黑马,但一个从山东出发一个从广东出发,A跟H比的就是出发地,虽然都是到同一个地方
"100"为北京,A是广东,H是山东,用A==H判断时就是在判断广东和山东是不是同一个地方
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马