下面代码的输出是false
String str = "3456";
String str1 = "3456";
System.out.println(Integer.valueOf(str).equals(str1));
我不明白。我以为它会回来true
。当我为 SCJP 做准备时,了解其背后的原因可能会有所帮助。有人可以帮忙吗?
一个Integer
永远不会是equal
一个String
。
这两个类都有非常严格的equals()
定义,只接受它们各自类型的对象。
当且仅当参数不是
null
并且是包含与该Integer
对象相同的 int 值的对象时,结果才为真。
当且仅当参数不是
null
并且是表示与该String
对象相同的字符序列的对象时,结果才为真。
这实际上是一种非常常见的实现方式equals()
:只有同一类(有时是子类)的对象才能相等。其他实现是可能的,但例外。
一个常见的例外是集合,例如List
:与任何其他实现相比List
,遵循约定的每个实现都将返回,如果它以相同的顺序具有相同的内容。true
通常,在实现时equals()
,首先要做的事情之一是检查对象是否属于同一类型。
public boolean equals(Object obj) {
if (!(obj instanceof SomeType)) return false;
...
}
这也适用于Integer
和String
类,它回答了你为什么会收到false
结果的问题。
equals() 方法的一般合同规定(除其他事项外)被比较的对象需要属于同一类。这就是为什么你永远无法将苹果与橙子进行比较的原因。
有关 equals() 方法的完整合同,请参阅 javadocs。
整数对象不能等于字符串对象
利用 :
boolean a = str.equals(str1);
或者
boolean a = (Integer.parseInt(str) == Integer.parseInt(str1));