首页新闻找找看学习计划

对象引用和对象本身内容

0
[已解决问题] 解决于 2018-03-22 09:17

学习Java的时候遇到一个问题?

Integer i1=new Integer(51);
Integer i2=new Integer(51);

System.out.println(i1==i2);   --》false
System.out.println(i1.equals(i2));   -->true

我知道i1和i2都是两个Integer对象的引用,他们指向的是对象的堆内存地址,每个对象都是标识唯一的,返回false我可以理解。但是第二个理解不了,我网上查了Object类的equals方法源码,网上答案只是:return this==object(形参);那样的话第二个打印结果不可能是:true  !!! 猜测的结果是equals方法源码不只有那一句,应该还有一句:如果地址不一致,则比较其内容。

注意:i1引用的可不是String对象,所以不可能调用String重写的equals方法。

请各位楼主帮我解析下,object的equals方法和逻辑运算符“==”比较的不是对象的引用吗?难道基本数据类型有不同的比较,是网上源码错了还是其他地方错了!求源码 !

隐语者的主页 隐语者 | 初学一级 | 园豆:34
提问于:2018-03-20 14:46
< >
分享
最佳答案
1

你好,equals函数是java Object类的函数。而Integer类覆写了equals()函数,所以楼上的代码就是Integer的equals源码,而String也有自己的equals()函数:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

而Object类中的equals源码:

public boolean equals(Object obj) {
    return (this == obj);
}

可以发现equals实际上和==是一样的,而在Integer类中,覆写了这个方法,

从楼上的Integer的equals源码发现,equals函数把obj的Integer对象变成int类型的数据,value也是int类型的数据

于是就变成int a=51; int b=51;if(a==b)

奖励园豆:5
Shendu.CC | 小虾三级 |园豆:1811 | 2018-03-20 19:11
其他回答(2)
0

public boolean equals(Object obj) {
  if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
  }
  return false;
}

Object.equals源码.

好像是如果是对象比较的是引用,如果是Interger类对象将其拆箱转为int比较值吧

wdmiye | 园豆:118 (初学一级) | 2018-03-20 15:05

您好,直接:return false;  ??

我想您的意思是,根据上面System.out.println(i1.equals(i2));如果不是integer对象,是可以直接返回false了(对象引用的比较您直接省略了)。

但是:能不能给我完整的源码!,谢谢(包含对象引用的比较)

支持(0) 反对(0) 隐语者 | 园豆:34 (初学一级) | 2018-03-20 15:16

@隐语者: 二楼的说的完全

支持(0) 反对(0) wdmiye | 园豆:118 (初学一级) | 2018-03-22 08:30
0

1.对于对象引用类型:“==”比较的是对象的内存地址

2.Integer源码如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

所以第二个位true,最终比较的是int值

麦稻 | 园豆:216 (菜鸟二级) | 2018-03-20 21:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册