You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何逻辑相似的两个if语句输出不同?LeetCode290问题咨询

关于LeetCode第290题中字符串比较的疑问

在LeetCode第290题的解题过程中,我定义了哈希表HashMap<Character,String> map = new HashMap<>();,其中pattern是字符串,arr是字符串数组。

以下代码可以正常通过所有测试用例:

if (!map.get(pattern.charAt(i)).equals(arr[i])) {
    return false;
}

但替换成下面的代码后,无法通过所有测试用例:

if (map.get(pattern.charAt(i)) != (arr[i])){
    return false;
}

我的完整解法代码如下:

class Solution {
    public boolean wordPattern(String pattern, String s) {
        String[] arr=s.split(" ");
        if (arr.length!=pattern.length()) {
            return false;
        }
        HashMap<Character,String> map = new HashMap<>();
        for (int i=0;i<arr.length;i++) {
            if (map.containsKey(pattern.charAt(i))){
                // 此处是疑问所在
                if (!map.get(pattern.charAt(i)).equals(arr[i])){
                    return false;
                }
            } else {
                if (map.containsValue(arr[i])) {
                    return false;
                }
                 map.put(pattern.charAt(i),arr[i]);
            }
        }
        return true;
    }
}

问题原因

Java里String属于引用类型:

  • !=比较的是两个对象的内存地址,只有当两个变量指向同一个内存中的String对象时,==才会返回true,!=返回false。
  • equals()方法(String类重写过)比较的是字符串的实际内容,只要两个字符串的字符序列完全一致,就会返回true。

在本题中,map.get(pattern.charAt(i))是从哈希表中取出的String对象,而arr[i]是通过s.split(" ")生成的新String对象,它们可能内容完全相同,但内存地址不同。此时用!=判断会误认为两者不相等,导致错误返回false;而equals()能正确识别内容一致,不会触发错误判断。

所以比较字符串内容时必须用equals(),不能用!=或==(除非能确保是同一个对象引用)。

内容的提问来源于stack exchange,提问作者Paurab Bhattacharjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:30:51