StringBuilder反向改变我的初始变量?

时间:2014-02-13 14:38:46

标签: java reference stringbuilder palindrome

我最近开始使用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

4 个答案:

答案 0 :(得分:1)

您无法比较sbEntrysbEntryReverse,因为sbEntry.reverse()会更改StringBuffer所指的sbEntry的内容。与对不可变String对象进行操作的方法不同,StringBufferreverse()方法会改变StringBuffer对象内的字符缓冲区。 StringBuffer个对象是可变的,而String个对象不是。

相反,您需要将StringBuffersbEntrysbEntryReverse)的最终内容与原始输入字符串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() );

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

这是因为您将对sbEntry的引用副本传递给stringBuilder。

而不是:

StringBuilder sbEntryReverse = sbEntry.reverse();

试试这个:

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

答案 3 :(得分:-1)

Java doc说,

reverse()
Causes this character sequence to be replaced by the reverse of the sequence.

所以它会替换你原来的String。