学习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方法和逻辑运算符“==”比较的不是对象的引用吗?难道基本数据类型有不同的比较,是网上源码错了还是其他地方错了!求源码 !
你好,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)
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Object.equals源码.
好像是如果是对象比较的是引用,如果是Interger类对象将其拆箱转为int比较值吧
您好,直接:return false; ??
我想您的意思是,根据上面System.out.println(i1.equals(i2));如果不是integer对象,是可以直接返回false了(对象引用的比较您直接省略了)。
但是:能不能给我完整的源码!,谢谢(包含对象引用的比较)
@隐语者: 二楼的说的完全
1.对于对象引用类型:“==”比较的是对象的内存地址
2.Integer源码如下:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
所以第二个位true,最终比较的是int值