为什么我写的带排序的Java变位词校验方法本该返回true却返回false
问题根因
- 你代码返回false的核心原因是:Java中数组属于引用类型,
==运算符比较的是两个数组对象的内存地址,而不是数组内的元素内容。你这里的conA和conB是两个完全独立创建的数组对象,地址必然不同,所以不管元素内容是不是一致,conA == conB的结果永远是false。 - 你之前看到的
ArrayA == ArrayB的用法是错误的,只有两个数组变量指向同一个内存对象时,这个判断才会返回true,和内容无关。
修正方案(无需额外import)
因为你要求不能用额外import,所以不能直接用Arrays.equals(),自己手写数组元素比较逻辑即可,步骤如下:
- 先加前置判断:如果两个字符串长度不同,直接返回false,没必要走排序逻辑,效率更高。
- 排序完成后,遍历两个数组逐位比较元素即可。
修正后的完整代码
public static boolean anagramCheck (String a, String b) { // 前置长度校验,提前剪枝 if (a.length() != b.length()) { return false; } String[] conA = a.toLowerCase().split(""); String[] conB = b.toLowerCase().split(""); //sort A for (int i = 0; i < (conA.length-1); i++) { for (int j = i + 1; j < conA.length; j++) { if (conA[i].compareTo(conA[j]) > 0) { String temp = conA[i]; conA[i] = conA[j]; conA[j] = temp; } } } //sort B for (int i = 0; i < conB.length; i++) { for (int j = i + 1; j < conB.length; j++) { if (conB[i].compareTo(conB[j]) > 0) { String temp = conB[i]; conB[i] = conB[j]; conB[j] = temp; } } } // 逐位比较数组元素 for (int k = 0; k < conA.length; k++) { if (!conA[k].equals(conB[k])) { return false; } } return true; }
额外优化提示
你当前用split拆分字符串得到String数组的方式性能一般,也可以直接转成char数组排序,逻辑完全一致,比较的时候直接用==比较char值即可,不需要调用equals,运行效率更高。
内容的提问来源于stack exchange,提问作者Merudoo
相关产品推荐
相关产品推荐

