黑马程序员技术交流社区

标题: 我记得两组数组一个相等,一个不想等的呀!为什么不对 [打印本页]

作者: 王勇文    时间: 2013-1-22 11:10
标题: 我记得两组数组一个相等,一个不想等的呀!为什么不对
  1. public class Test7{

  2. public static void main(String[] args)
  3. {
  4. Integer i1 =new Integer(200);
  5. Integer i2 =new Integer(200);
  6. Integer i3=new Integer(100);
  7. Integer i4=new Integer(100);

  8. if (i1 == i2)
  9. {
  10. System.out.println("i1 等于 i2");

  11. }
  12. else
  13. {
  14. System.out.println("i1 不等于 i2");

  15. }
  16. if(i3==i4){
  17. System.out.println("3等于4");
  18. }else{
  19. System.out.println("不等于");
  20. }
  21. }
  22. }
复制代码
我学的时候我记得在-128至127之间的数是相等的呀!  现在为什么不等了。

作者: 梅杰明    时间: 2013-1-22 11:13
我来看看{:soso_e100:}
作者: 黑马刘杰    时间: 2013-1-22 11:13
本帖最后由 黑马刘杰 于 2013-1-22 11:18 编辑

我有点晕,你这是什么标题啊,代码与标题不符啊,我的结果是
i1 != i2
不等于
你每new一个对象时,就在堆内存中创建一个内存地址,然后,通过构造方法将该内存的值写入。
两个对象的值一样,但是内存地址不一样,当你比较对象时,就是比较的内存地址,当然就不一样了
作者: 贾文泽    时间: 2013-1-22 11:20
都是不相等啊,你电脑中枪了吧。{:soso_e144:}
作者: yong230    时间: 2013-1-22 11:22
使用new 关键字创建对象,没次都分配新的内存空间,=比较的是对象的内存地址,故不相同了
作者: 黄锦成    时间: 2013-1-22 11:37
两个都不相等啊。new出来的内存地址都不一样

Integer i5 = 100;
Integer i6 = 100;
自动装箱的,这里就相等。因为它会去看缓存中存不存在。存在就用缓存的
作者: 王少雷    时间: 2013-1-22 11:43
引用对象,开了空间的,如果你非让相等的话,用equals~
如果是指向的话,JVM自动 拆装箱,有大小 限制~
作者: 王国伟.    时间: 2013-1-22 11:48
使用new时,没有分配新的内存空间,==比较的是内存空间地址,肯定会不一样。
作者: 黑马-周科    时间: 2013-1-22 12:30
涉及到多态,equals和==的区别。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

如按上述编译的话,比较的是内存地址,新建对象内存地址都不一样。编译结果如上。

更改后代码如下。

public class Test{

public static void main(String[] args)
{
      Integer i1 =new Integer(200);
      Integer i2 =new Integer(200);
      Integer i3=new Integer(100);
      Integer i4=new Integer(100);

   if (i1.equals(i2))   //==改成equals
  {
        System.out.println("i1 等于 i2");

  }
  else
{
         System.out.println("i1 不等于 i2");

  }
    if(i3.equals(i4))  //==改成equals
  {
         System.out.println("i3等于i4");
  }
  else
  {
        System.out.println("i3不等于i4");
  }
}
}

编译结果:

i1 等于 i2
i3 等于 i4
作者: 贾文泽    时间: 2013-1-22 12:32
或许我可以这么跟你解释
每个对象都有自己的哈希码,利用这个哈希码可以表示一个对象,在Object提供的hashCode()方法的默认实现是通过将对象的内存地址转换为一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的...
但是,这前提是在某些架构中,再者,这种不同对象的hashCode()相等也只是可能存在的现象,几率很小
作者: 苏克    时间: 2013-1-22 12:56
这个问题你要多看看对象是什么在内存中创建的。

下面我门在看看自动封箱是怎么内存是怎么创建的。
5,Integer i5 =200;
读到这句话,开辟一个空间对象,值是200,并将地址值赋给i5。
6,Integer 6 =200;
同上。
7,Integer i7 =100;
读到这句话,就不会在开辟空间,而是直接将100的内存地址拿过来赋给i7;
8,Integer i8 =100;
同上。
这就是为什么i3不等于i4;i7等于i8的原因了。
我们记住所有new 的对象都不会相等。因为当java读取到这句话的时候,它就会认为是创建一个新对象,并且是不会和其它对象相等的。

作者: 贾文泽    时间: 2013-1-22 13:16
苏克 发表于 2013-1-22 12:56
这个问题你要多看看对象是什么在内存中创建的。

对象是不会相等没问题,但是equals方法比较的是对象的hashCode码,在某种情况下两个不同的对象的hashCode码是会相等的。。。。
作者: 苏克    时间: 2013-1-22 13:24
IC-月辰 发表于 2013-1-22 13:16
对象是不会相等没问题,但是equals方法比较的是对象的hashCode码,在某种情况下两个不同的对象的hashCode ...

这说的比较对象,你要比较hashCode();,就要理解hashCode值的具体怎么生成的,才能知道具体怎么什么时候相等,什么时候不行等。
作者: 高浩    时间: 2013-1-23 15:55
Integer i1 =new Integer(200);

Integer i2 =new Integer(200);

Integer i3=new Integer(100);

Integer i4=new Integer(100);

你这里创建了三个对象,在堆内存中开辟了新空间,它们的地址是不同的,而==是比较地址是否相同,不是比较内容是否相同,所以会出现你那种结果
若想比较内容要用到equals方法





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