为什么String等于我的代码不起作用?

时间:2016-02-27 05:26:24

标签: java string equals

我已经检查了两个比较字符串,但即使是值参数str和temp也都打印了“mn”。 str.equals(temp)仍然返回false。

public int strStr(String haystack, String needle) {
            StringBuffer str=new StringBuffer(needle);

            int result=-1;

            for(int i=0;i<=haystack.length()-needle.length();i++){
                StringBuffer temp = new StringBuffer(haystack.substring(i, i+needle.length()));

                System.out.println(temp.equals(str));
                System.out.println(temp+"="+str);

                if (str.equals(temp)){
                    result=i;
                    break;
                }
            }
            return result;
        }

3 个答案:

答案 0 :(得分:5)

您正在比较两个StringBuffer个对象。 equals(Object)的{​​{1}}方法继承自StringBuffer,并且定义为与比较对象引用相同。

对象不同,因此,示例中的结果为Object

请改为尝试:

false

这是有效的,因为 if (str.toString().equals(temp.toString())){ 比较了字符串值,而不是字符串对象引用。 (但请注意,您必须转换两个String.equals(Object)个对象,因为如果参数不是StringBuffer对象,String.equals(Object)将始终返回false。)

另请注意,使用String作为str变量的名称极具误导性。大多数人都希望StringBuffer的内容成为str。 (我做了!!)

FWIW,我正在试着更有效地比较两个String对象的内容。上面的代码创建并丢弃了两个临时StringBuffer对象。我能想到的最好的就是手工编写代码;例如像这样的东西:

String

答案 1 :(得分:1)

您正在比较对StringBuffer对象的引用而不是实际的字符串。并且

  

StringBuffer类不会覆盖Object类的equals()方法。

试试这个

str.toString().equals(temp.toString())
  

java.lang.StringBuffer.toString()方法返回一个表示此序列中数据的字符串。

     

分配并初始化一个新的String对象,以包含此对象当前表示的字符序列。然后返回此字符串。

这就是为什么你可以通过将两个StringBuffer对象转换为字符串来比较它们。

答案 2 :(得分:-1)

您正在将StringBuffer与String进行比较,因此equals方法始终返回false。

str.equals(temp.toString())

但是当你这样做时,你需要知道另一个重要的概念

System.out.println(temp+"="+str);

你正在打印temp是stringbuilder,java内部调用temp.toString()来实现这个目的。