我已经检查了两个比较字符串,但即使是值参数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;
}
答案 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()来实现这个目的。