黑马程序员技术交流社区

标题: Integer对象求解 [打印本页]

作者: wodeairenw    时间: 2013-3-11 14:30
标题: Integer对象求解
本帖最后由 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新特性的话上面一个也应该相等的啊
复制代码

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

你没明白我的意思,就是为什么下面一个是true上面一个是false,照1.5新特性的话上面一个也应该相等的啊。
作者: 张宁    时间: 2013-3-11 14:56
  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. }
复制代码

作者: 邹学良    时间: 2013-3-11 15:02
本帖最后由 邹学良 于 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判断时就是在判断广东和山东是不是同一个地方




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2