因此,我正在为周末的高中比赛练习,我无法弄清楚为什么这个问题会回来错误
String str = "12";
Integer num = new Integer(12);
Double val = new Double(12.0);
System.out.print(str.equals(num));
System.out.print(" " + num.equals(val));
答案 0 :(得分:3)
如果您查看equals
和String
课程的Integer
方法,您会看到原因:
<强> 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;
}
<强> Integer.equals:强>
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
如您所见,因为所有12
,"12"
和12.2
都是instances of different classes
,因此equals
会返回false
。
答案 1 :(得分:2)
因为它们是具有相同值的不同类型。 "12"
不等于12
。
即,"12"
,12
和12.0
是3种不同的类型。
答案 2 :(得分:0)
原因是因为你正在创建3个新对象,而Java是一种基于引用的语言,这3行:
String str = "12";
Integer num = new Integer(12);
Double val = new Double(12.0);
所以你应该第一次理解,这就是你在这里创建3个新对象。
第二个是检查equals方法在每个类中的作用。 对于头等舱
System.out.print(str.equals(num));
在这一行中,你从String类调用equals方法,所以如果去检查String类中的方法,你会看到:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
所以你应该注意的第一件事是这个方法返回true的可能性只有两种: 第一个是,两个对象都指向相同的引用,这意味着你做这样的事情:
String str = "12";
String strb = str;
,第二个是作为引用传递的Object将是一个String类,永远不会发生。 因为在这一行:
System.out.print(str.equals(num));
您正在发送一个Integer作为参数。所以第二种情况永远不会发生。
对于下一个案例:
System.out.print(" " + num.equals(val));
你应该在Integer类中分析equals方法,你应该看到类似这样的东西:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
在这里,你看,这个方法检查返回true的可能性的唯一方法是,你发送一个Integer作为参数。(它表示来自Integer类的引用)。
我希望,这对你有帮助。 问候。