【问题标题】:String and StringBuilder, while using equals() [duplicate]String 和 StringBuilder,同时使用 equals() [重复]
【发布时间】:2015-11-30 06:08:18
【问题描述】:
String s = new String("Abc");
StringBuilder s1 = new StringBuilder("Abc");
System.out.println(s.equals(s1));  

输出:假

为什么?谁能解释一下这个?

【问题讨论】:

  • 这种行为的主要原因是由于String类的代码中的这一行equals方法:1017 if(anObject instanceof String){ //因此如果传入equals方法的Object必须是instanceOf String只要。否则它总是返回 false。

标签: java string stringbuilder


【解决方案1】:

String 不是 StringBuilder,那么您为什么希望它们相等?

s.equals(s1.toString())

将返回 true,因为这将是两个 Strings 的比较。

Stringequals 实现为:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        ...
    }
    return false;
}

anObject 不是String 的实例时(并且只有String 可以是String 的实例,因为String 类是最终类),equals 返回 false。

【讨论】:

  • 能否详细说明
【解决方案2】:

Java 提供了StringBuffer 和String 类,String 类用于操作不能更改的字符串。简单地说,String 类型的对象是只读且不可变的。 StringBuffer 类用于表示可以修改的字符。

在这种情况下,当你有:

  String s = new String("Abc");
  StringBuilder s1 = new StringBuilder("Abc");
  System.out.println(s.equals(s1));  

给出false,因为在StringBuffer 类中equals 方法没有像在String 类中那样被覆盖。 因此,您首先需要将其转换为字符串,然后使用 equals 方法,如下所示:

s.equals(s1.toString()) gives `true`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2014-03-01
    • 2015-06-07
    • 2014-10-06
    相关资源
    最近更新 更多