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

为什么我写的带排序的Java变位词校验方法本该返回true却返回false

问题根因

  • 你代码返回false的核心原因是:Java中数组属于引用类型,==运算符比较的是两个数组对象的内存地址,而不是数组内的元素内容。你这里的conA和conB是两个完全独立创建的数组对象,地址必然不同,所以不管元素内容是不是一致,conA == conB的结果永远是false。
  • 你之前看到的ArrayA == ArrayB的用法是错误的,只有两个数组变量指向同一个内存对象时,这个判断才会返回true,和内容无关。

修正方案(无需额外import)

因为你要求不能用额外import,所以不能直接用Arrays.equals(),自己手写数组元素比较逻辑即可,步骤如下:

  1. 先加前置判断:如果两个字符串长度不同,直接返回false,没必要走排序逻辑,效率更高。
  2. 排序完成后,遍历两个数组逐位比较元素即可。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:03