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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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之间的数是相等的呀!  现在为什么不等了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

13 个回复

正序浏览
Integer i1 =new Integer(200);

Integer i2 =new Integer(200);

Integer i3=new Integer(100);

Integer i4=new Integer(100);

你这里创建了三个对象,在堆内存中开辟了新空间,它们的地址是不同的,而==是比较地址是否相同,不是比较内容是否相同,所以会出现你那种结果
若想比较内容要用到equals方法
回复 使用道具 举报
IC-月辰 发表于 2013-1-22 13:16
对象是不会相等没问题,但是equals方法比较的是对象的hashCode码,在某种情况下两个不同的对象的hashCode ...

这说的比较对象,你要比较hashCode();,就要理解hashCode值的具体怎么生成的,才能知道具体怎么什么时候相等,什么时候不行等。
回复 使用道具 举报
苏克 发表于 2013-1-22 12:56
这个问题你要多看看对象是什么在内存中创建的。

对象是不会相等没问题,但是equals方法比较的是对象的hashCode码,在某种情况下两个不同的对象的hashCode码是会相等的。。。。
回复 使用道具 举报
这个问题你要多看看对象是什么在内存中创建的。

  • Integer i1 =new Integer(200);
    这句话的创建机制是,首先在栈内存中存在一个i1,然后在堆内存开辟一个空间对象,并将对象的地址值传递给i1,要明白每个空间对象的地址值都是唯一,并且此时这个空间对象的值就是200。
  • Integer i2 =new Integer(200);
    这句话和上面的创建机制一样。
  • Integer i3=new Integer(100);
    但是这句话就补一样了,java中对于-128到127之间的数值,只会创建一个实体对象。也就是当读到这一句话的时候,其实是在内存空间中开辟了两个空间对象,第一个就是new Integer();比并且将地址值赋给i3,同时又开辟了一个空间对象专门用于存放100这个数值,并且把100这个值的地址值赋给了new Integer();对象,其实这个时候i3对应的对象内存放的也是一个地址引用,而不是实体100.
  • Integer i4=new Integer(100);
    当读到这句话的时候,同样会创建一个new Integer();的空间对象,并把地址值赋给i4,但是不会在创建100的对象了,而是把上面已经创建的100的对象的地址引用存放在i4对应的对象空间内。
下面我门在看看自动封箱是怎么内存是怎么创建的。
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读取到这句话的时候,它就会认为是创建一个新对象,并且是不会和其它对象相等的。
回复 使用道具 举报
或许我可以这么跟你解释
每个对象都有自己的哈希码,利用这个哈希码可以表示一个对象,在Object提供的hashCode()方法的默认实现是通过将对象的内存地址转换为一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的...
但是,这前提是在某些架构中,再者,这种不同对象的hashCode()相等也只是可能存在的现象,几率很小
回复 使用道具 举报
涉及到多态,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

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
使用new时,没有分配新的内存空间,==比较的是内存空间地址,肯定会不一样。
回复 使用道具 举报
引用对象,开了空间的,如果你非让相等的话,用equals~
如果是指向的话,JVM自动 拆装箱,有大小 限制~
回复 使用道具 举报
两个都不相等啊。new出来的内存地址都不一样

Integer i5 = 100;
Integer i6 = 100;
自动装箱的,这里就相等。因为它会去看缓存中存不存在。存在就用缓存的
回复 使用道具 举报
使用new 关键字创建对象,没次都分配新的内存空间,=比较的是对象的内存地址,故不相同了
回复 使用道具 举报
都是不相等啊,你电脑中枪了吧。{:soso_e144:}
回复 使用道具 举报
本帖最后由 黑马刘杰 于 2013-1-22 11:18 编辑

我有点晕,你这是什么标题啊,代码与标题不符啊,我的结果是
i1 != i2
不等于
你每new一个对象时,就在堆内存中创建一个内存地址,然后,通过构造方法将该内存的值写入。
两个对象的值一样,但是内存地址不一样,当你比较对象时,就是比较的内存地址,当然就不一样了

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
我来看看{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马