4

下面代码的输出是false

String str = "3456";
String str1 = "3456";
System.out.println(Integer.valueOf(str).equals(str1));

我不明白。我以为它会回来true。当我为 SCJP 做准备时,了解其背后的原因可能会有所帮助。有人可以帮忙吗?

4

4 回答 4

15

一个Integer永远不会是equal一个String

这两个类都有非常严格的equals()定义,接受它们各自类型的对象。

  • Integer.equals()

    当且仅当参数不是null并且是包含与该Integer对象相同的 int 值的对象时,结果才为真。

  • String.equals()

    当且仅当参数不是null并且是表示与该String对象相同的字符序列的对象时,结果才为真。

这实际上是一种非常常见的实现方式equals():只有同一类(有时是子类)的对象才能相等。其他实现是可能的,但例外。

一个常见的例外是集合,例如List:与任何其他实现相比List,遵循约定的每个实现都将返回,如果它以相同的顺序具有相同的内容。true

于 2013-07-09T10:58:30.517 回答
2

通常,在实现时equals(),首先要做的事情之一是检查对象是否属于同一类型。

public boolean equals(Object obj) {
    if (!(obj instanceof SomeType)) return false;
    ...
}

这也适用于IntegerString类,它回答了你为什么会收到false结果的问题。

于 2013-07-09T10:59:48.260 回答
1

equals() 方法的一般合同规定(除其他事项外)被比较的对象需要属于同一类。这就是为什么你永远无法将苹果与橙子进行比较的原因。

有关 equals() 方法的完整合同,请参阅 javadocs。

于 2013-07-09T10:59:24.950 回答
0

整数对象不能等于字符串对象

利用 :

boolean a = str.equals(str1);

或者

boolean a = (Integer.parseInt(str) == Integer.parseInt(str1));
于 2013-07-09T11:03:35.463 回答