
Java 中用 == 比较字符串仅判断引用是否相同,而非内容是否相等;必须使用 .equals()(或 .equalsIgnoreCase())才能安全比对字符串值。
java 中用 `==` 比较字符串仅判断引用是否相同,而非内容是否相等;必须使用 `.equals()`(或 `.equalsignorecase()`)才能安全比对字符串值。
在 Java 开发中,一个高频且隐蔽的错误是误用 == 运算符比较字符串内容。正如 Monopoly 银行管理程序所暴露的问题:无论用户输入真实玩家名(如 "Alice")还是 "bank",askAndCheckRecipient() 方法始终返回 "recipient is not valid"。根本原因在于以下这行错误代码:
if(recipient.toLowerCase() == player.getName().toLowerCase() || recipient.toLowerCase() == "bank")
这里使用了 ==,它比较的是两个字符串对象在内存中的引用地址,而非它们的字符序列。即使两个字符串内容完全相同(例如 "alice" 和 "alice"),只要它们是不同对象(如由 nextLine() 创建 vs 字面量 "bank"),== 就会返回 false。
✅ 正确做法是使用 .equals() 方法进行值比较:
static String askAndCheckRecipient(Player[] playerArray) {
Scanner scan = new Scanner(System.in);
System.out.println("Who is the recipient?: ");
String recipient = scan.nextLine().trim(); // 建议添加 trim() 去除首尾空格
// 先检查是否为 "bank"(忽略大小写)
if ("bank".equalsIgnoreCase(recipient)) {
return "bank";
}
// 再遍历玩家,匹配姓名(忽略大小写)
for (Player player : playerArray) {
if (recipient.equalsIgnoreCase(player.getName())) {
return recipient;
}
}
return "recipient is not valid";
}同理,askAndCheckPayer() 方法也需同步修正。此外,推荐使用 .equalsIgnoreCase() 替代手动调用 .toLowerCase().equals(),它更简洁、高效,且能正确处理 Unicode 大小写转换(如土耳其语 i 的特殊规则)。
立即学习“Java免费学习笔记(深入)”;
⚠️ 注意事项:
- 不要对可能为
null的字符串调用.equals()—— 应将字面量(如"bank")放在左侧,或先判空; - 使用
.trim()可避免因用户多输空格导致匹配失败; -
Scanner实例建议复用或统一管理,当前代码中多次创建new Scanner(System.in)虽无功能错误,但属资源冗余。
总结:字符串内容比较永远用 .equals() 或其变体(.equalsIgnoreCase() / .contentEquals()),绝不用 ==。 这一原则不仅关乎 Monopoly 程序的逻辑正确性,更是 Java 字符串处理的基石规范。


















