为何逻辑相似的两个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
相关产品推荐
相关产品推荐

