当我比较java中的Character时,为什么equals()不起作用,而==起作用



我正试图解决LeetCode上的经典有效括号问题。

这就是我所做的,它可以通过所有的测试用例:

public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for (Character c : s.toCharArray()) {
if (c.equals('{') || c.equals('[') || c.equals('(')) {
stack.push(c);
} else {
Character check = stack.isEmpty() ? ' ' : stack.pop();
if (check != (c - 1) && check != (c - 2)) { //***
return false;
}
}
}
return stack.isEmpty();
}

但是当我把***行改成这个:

if (!check.equals(c - 1) && !check.equals(c - 2)) {}

虽然它可以通过编译器,但它不能返回正确的答案,甚至不能像"((";。

通常,我们不应该使用equals((而不是==来比较Character吗?

如果您将调试添加到有问题的If块

System.out.println(c);
System.out.println(c -1);
System.out.println(c -2);

您将看到后面跟着两个int值的char。

在您的原始代码中,正在进行类型转换。

在我的IDE中,甚至有一个警告

不太可能的equals((参数类型:int似乎与Character无关

如以上评论所述:

从Character中减去一个int将返回一个int值。当使用equals时,您需要将其强制转换回char,因为它将自动装箱为Integer

最新更新