Java StringBuilder反向更改初始变量?

Java StringBuilder反向更改初始变量?,java,reference,stringbuilder,palindrome,Java,Reference,Stringbuilder,Palindrome,我最近开始使用Java,我正在尝试一个简短的程序来检查单词或短句中的回文。 我想将StringBuilder用于反向方法。我的想法是从用户条目中取一个变量(转换为小写,去掉空格和逗号),然后取另一个变量保存反向条目,并使用.equals进行比较。 但是,.reverse()方法正在更改我的用户条目的值,我不知道为什么。我知道Java中的引用,但只是最近才知道,还没有完全理解 任何帮助都将不胜感激 import java.util.*; public class Palindrome { pu

我最近开始使用Java,我正在尝试一个简短的程序来检查单词或短句中的回文。 我想将StringBuilder用于反向方法。我的想法是从用户条目中取一个变量(转换为小写,去掉空格和逗号),然后取另一个变量保存反向条目,并使用.equals进行比较。 但是,.reverse()方法正在更改我的用户条目的值,我不知道为什么。我知道Java中的引用,但只是最近才知道,还没有完全理解

任何帮助都将不胜感激

import java.util.*;

public class Palindrome {

public static void main(String[] args) {

    Scanner kb = new Scanner(System.in);
    System.out.println("Enter a word or phrase to test for a palindrome: ");
    String entry = kb.nextLine();

    String entryLower = entry.toLowerCase();
    String entryNoSpace = entryLower.replace(" ", "");
    String entryFinal = entryNoSpace.replace(",", "");

    //Convert String to StringBuilder to use reverse method
    StringBuilder sbEntry = new StringBuilder(entryFinal);
    System.out.println("sbEntry: " + sbEntry);

    StringBuilder sbEntryReverse = sbEntry.reverse();
    System.out.println("sbEntryReverse: " + sbEntryReverse);


    System.out.println("sbEntry: " + sbEntry);
对于单词“Dog”,这将给出以下输出:

Enter a word or phrase to test for a palindrome: 
Dog
sbEntry: dog
sbEntryReverse: god
sbEntry: god
Java博士说

reverse()
Causes this character sequence to be replaced by the reverse of the sequence.
因此,它将替换原始字符串

StringBuilder
上调用
reverse()
会改变其内容:

StringBuilder sb = new StringBuilder("hello");
System.out.println(sb); // hello

sb.reverse();
System.out.println(sb); // olleh

sb.reverse();
System.out.println(sb); // hello

这是因为您将引用sbEntry的副本传递到stringBuilder中

与此相反:

StringBuilder sbEntryReverse = sbEntry.reverse();
试试这个:

StringBuilder sbEntryReverse = new StringBuilder(sbEntry.toString()).reverse();

您无法比较
sbEntry
sbEntryReverse
,因为
sbEntry.reverse()
更改了
sbEntry
引用的
StringBuffer
的内容。与操作不可变的
String
对象的方法不同,
StringBuffer
方法,如
reverse()
改变
StringBuffer
对象内的字符缓冲区
StringBuffer
对象是可变的,而
String
对象不是可变的

相反,您需要将
StringBuffer
sbEntry
sbEntryReverse
)的最终内容与原始输入字符串
entryFinal
)进行比较:

String entryLower = entry.toLowerCase();
String entryNoSpace = entryLower.replace(" ", "");
String entryFinal = entryNoSpace.replace(",", "");

//Convert String to StringBuilder to use reverse method
StringBuilder sbEntry = new StringBuilder(entryFinal);
StringBuilder sbEntryReverse = sbEntry.reverse();
boolean isPalindrome = entryFinal.equals( sbEntryReverse.toString() );

你读过这个方法吗?StringBuilder是可变的,当你对它执行操作时,你会对它进行修改。我看过javadoc,但我仍然无法让它工作。GregTheRules在回答中给了我一个有效的答案谢谢!这是我想要的。我可以问一下为什么添加.toString()不会影响原始变量吗?因为toString()返回一个“valueOf”sbEntry而不引用原始变量。明白了。我对引用的理解是粗略的,但这有助于这里没有理由创建两个
StringBuffer
对象。只需创建一个反转字符串,然后将其与原始输入字符串进行比较(
entryFinal
)。
reverse()
不会替换原始输入字符串。它将替换
StringBuffer
内部的字符缓冲区内容。感谢您提供详细说明。这很有道理。我没有被告知StringBuffer对象是可变的,而字符串不是。为了完全避免这个可变的问题,考虑使用<代码> Strutuul.Retring(String)< /C>或类似的方法,而不是<代码> StringBuffer .RetrySe()/<代码>。请参阅。@DerekMahar因此,
StringBuilder
在内部维护
字符串的副本(或附加的所有
字符串的副本),当调用
reverse
时,修改内部副本?@KevinBowersox是,仅修改内部副本。