Java 为什么.equals()不起作用

Java 为什么.equals()不起作用,java,string,replace,equals,Java,String,Replace,Equals,我打印了两个字符串,它们完全相同,没有空格,因为我替换了它们。 这里是编译的 public class Palindrome{ public static boolean isPalindrome(String word){ int length; String oppositeWord =""; word = word.replace(" ",""); word = word.toLowerCase();

我打印了两个字符串,它们完全相同,没有空格,因为我替换了它们。 这里是编译的

 public class Palindrome{
    public static boolean isPalindrome(String word){
        int length;
        String oppositeWord ="";
        word = word.replace(" ","");
        word = word.toLowerCase();
        length = word.length();

        for(int i=length-1;i>=0;i--){
            if(Character.isLetter(word.charAt(i))){
                oppositeWord +=word.charAt(i);
            }else{
                word = word.replace(word.charAt(i),'\0');
            }

        }
        System.out.println(oppositeWord);
        System.out.println(word);

        return oppositeWord.equals(word);

    }

    public static void main(String[]args){
        System.out.println(isPalindrome("Madam, I'm Adam"));
    }
}

将字符替换为“\0”与同时删除该字符不同。当你打印它时,它不会显示出来,所以它们看起来是一样的,但它仍然存在,并且会使它们不相等

试着将长度与单词一起打印。

这一行是错误的:

word = word.replace(word.charAt(i),'\0');
\0
替换字符与删除字符不同。你想要这样的东西:

word = word.replace(""+word.charAt(i), "");
然而,正如上面所说,有更好的方法来检查一个单词是否是回文

另外,我不知道为什么,但是您的ideone.com显示了与我的IDE(NetBeans)不同的输出。你的作品显示:

madamimadam
madamimadam
false
但作为一个例子,其结果是:

madamimadam
madam  i  madam
false

这就解释了为什么结果为
false
。我最好的猜测是,您的在线IDE在将您添加的
\0
转换为文本时遇到了一些问题,只是没有打印任何内容。

首先,Java字符串是不可变的,不应该逐个字符进行操作(这就是Java库具有StringBuilder和StringBuffer类的原因)

其次,Java字符串实际上并不等同于C/C++中的
char[]
。它们更像是
char*
,因为它们指向保存实际信息的其他内存。将非字母字符更改为
'\0'
空字符不会从字符串中删除它们。它们不会打印在屏幕上,但仍存在于内存中。(这是Java字符串不同于C/C++字符串的一种方式……Java字符串不是以null结尾的字符数组!)

如果您添加一些打印语句来打印长度,您会发现
对立词
小两个字符

System.out.println(oppositeWord.length()); // prints  11
System.out.println(word.length());         // prints  13
要使两个字符串真正相等,在
word
中替换的相同字符也必须以相同的索引插入到
oppositeWord
中,或者从两者中删除。i、 e

for(int i=length-1;i>=0;i--) {
    if(Character.isLetter(word.charAt(i))) {
        oppositeWord +=word.charAt(i);
    } else {
        word = word.replace(word.charAt(i),'\0');
        oppositeWord += word.charAt(i); // << This line!
    }
}
for(int i=length-1;i>=0;i--){
if(Character.isleter(word.charAt(i))){
对立词+=字字符(i);
}否则{
word=word.replace(word.charAt(i),“\0”);

对立词+=单词字符(i);//正如bluemoon93所提到的,这两个字符串实际上并不相等。原始字符串是madam i madam。这意味着它包含使两个字符串不同的空格。我建议您使用正则表达式从原始字符串中删除标点、空格。这将删除任何额外的空格或标点

public boolean isPalindrome(String word){
    int length;
    String oppositeWord ="";

    word = word.toLowerCase();
    length = word.length();

    String newword = word.replaceAll("[\\s\\p{Punct}]", "");

    for(int i=length-1;i>=0;i--){
        if(Character.isLetter(word.charAt(i))){
            oppositeWord +=word.charAt(i);
        }

    }

    System.out.println(oppositeWord);
    System.out.println(newword);

    return oppositeWord.equals(newword);

}

返回结果现在将返回true,因为两个字符串是相等的,因为它们由有效字符匹配,并且不包含空格或标点符号。

为什么要变异
word
?我不知道你在问什么。它们不一样……相反的word是
madamimadam
,其中as word是
madamimadam
@TedBigham我复制了他的代码并在Eclipse中运行。这就是输出。它可能与他使用的0字节有关。SCNR:另一个回文
public boolean isPalindrome(String word){
    int length;
    String oppositeWord ="";

    word = word.toLowerCase();
    length = word.length();

    String newword = word.replaceAll("[\\s\\p{Punct}]", "");

    for(int i=length-1;i>=0;i--){
        if(Character.isLetter(word.charAt(i))){
            oppositeWord +=word.charAt(i);
        }

    }

    System.out.println(oppositeWord);
    System.out.println(newword);

    return oppositeWord.equals(newword);

}