这是我的代码:
Object a = "1234";
Object b = new Integer("1234");
我知道==
表示引用,equals()
表示包含。
现在为什么a.equals(b)
是假的?
每个人都有相同的价值。
答案 0 :(得分:7)
因为两者都来自不同的班级。 a
来自String
班级,b
来自Integer
班级。因此,它将返回false
而不进一步检查实例的内容。
尽管您已经使用Object
引用声明了这两个实例,但是在运行时,当您调用.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;
}
因此,如果您传递了另一个类的实例,它将返回false
。
答案 1 :(得分:5)
您的a
是Object
容器,其中包含String
个对象,而您的b
是Object
容器,其中包含Integer
个对象
当您在equals()
上致电a
时,会String.equals()
,String
会发现您的Integer
不等于{{1}}而且没有自动装箱和自动装箱的数量可以做到这一点。
答案 2 :(得分:1)
由于Kugathasan Abimaran已经给出了解释,我将添加您可以自己看到的这个小代码:
System.out.println(a + " might look like " + b + " but " + a.getClass() + " does not equal " + b.getClass());
这将导致:
1234可能看起来像1234但类java.lang.String不等于类java.lang.Integer