【问题标题】:How to compare two StringBuffer Objects using .equals() method? [duplicate]如何使用 .equals() 方法比较两个 StringBuffer 对象? [复制]
【发布时间】:2013-06-14 14:12:38
【问题描述】:

以下代码不起作用。谁能告诉我以下代码有什么问题。从逻辑上讲,它应该可以工作...

package assignments;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IsPalindrome {
public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(
                                      new InputStreamReader(System.in));
    System.out.println("Enter a Word:");
    StringBuffer sb1 = new StringBuffer(br.readLine());
    StringBuffer sb2 = new StringBuffer(sb1);
    sb1.reverse();

    if(sb2.equals(sb1))
        System.out.println("Palindrome");
    else
        System.out.println("Not a Palindrome");
}
}

【问题讨论】:

  • 您可能希望使用StringBuilder 而不是StringBuffer(如果您不从多个线程访问它),因为它更快。
  • 这可能会回答您的问题stackoverflow.com/questions/2012305/…
  • StringBuffer 不会覆盖从Object 继承的equals(),因此StringBuffer 中的内容只是比较了它们的引用。
  • 如果您还不知道,您应该阅读 API 文档,而不是对方法的行为做出假设。 StringBuffer documentation 表示它的 equals 方法是从 Object 继承的。
  • 如果可以使用StringBuilder,请不要使用StringBuffer。此类已被弃用近 10 年。 vanillajava.blogspot.com/2012/08/…

标签: java string tostring stringbuffer object-to-string


【解决方案1】:

试试

sb1.toString().equals(sb2.toString());

因为StringBuffer#toString方法返回的是存储在缓冲区内的数据的String值:

返回表示此序列中数据的字符串。分配并初始化一个新的 String 对象以包含该对象当前表示的字符序列。然后返回此字符串。对该序列的后续更改不会影响字符串的内容。

【讨论】:

  • 感谢@darijan,它成功了,但为什么我们不能直接比较两个字符串缓冲区对象?
  • 好吧,因为equals 方法没有以这种方式实现StringBuffers。仅当 StringBuffer 与其自身进行映射时,它才会返回 true。
  • @user1377586 StringBuffer 没有自己的equals 实现,因此调用最终在Object 的基于引用的实现中结束。
【解决方案2】:

在 StringBuffer 类中,equals 方法不会像在 String 类中那样被覆盖。在StringBuffer 中,它只是查看引用是否相同。 因此,您首先需要将其转换为字符串,然后使用 equals 方法。

所以试试

sb1.toString().equals(sb2.toString());

【讨论】:

    【解决方案3】:

    你可以写

    System.out.println("Enter a line:");
    String line = br.readLine().replace(" ", ""); // palindromes can have spaces
    String reverse = new StringBuilder(sb1).reverse().toString();
    
    if(line.equals(reverse))
        System.out.print("Not a ");
    System.out.println("Palindrome");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 2011-04-26
      • 1970-01-01
      • 2012-11-03
      • 2016-05-25
      • 2013-09-06
      • 2017-09-23
      相关资源
      最近更新 更多