问题描述:
首先来看一下,类似的代码程序:
有一个String类型的字符串str1 = "ababababab",还有另一个String类型的字符串str2 = "aba",那么编写程序,来检索在str1中,可以检索到【几个】str2,在初次接触到这个问题时,编写的方法代码如下:
1 /** 2 * 搜索索引处理程序 3 */ 4 private void searchString() 5 { 6 String temp; 7 String indexS = ""; 8 for (int i = 0; i <= (str1.length() - str2.length()); i++) 9 {10 temp = str1.substring(i,i+str2.length());11 if (temp.equals(str2))12 {13 indexS = indexS + i + ",";14 }15 }16 showIndexS(indexS);17 }
运行后,输出的结果是:0,2,4,6,
也就是说,在str1字符串中共找到含有str2字符串的索引有0,2,4,6,共有【4个】,在这个检索的方法中,是逐个字符进行检测的,看上去似乎没什么问题但是,在查看了jdk文档、搜索网上的解释后,发现这种检索的逻辑是完全不符合目前的检索规则的,因为,现在的搜索引擎在对输入的关键字到源中进行检索时,不会在已检索过的字符中检索,比如:str1 = "ababababab",str2 = "aba",要在str1中查找有几个str2,那么搜索引擎是:在第一次在str1中找到str2时,即索引是0,在进行下次往后的检索,是从索引为3的地方开始,即aba【b】ababab中的b处,而不是a【b】abababab中b处,它会跳过str2长度的索引,不会对之前检查的ba再纳入检测,因此得到结果就是:0,4,即只检测到两个
然后,再去jdk中找根据:其中在String类中有个replace()的方法,方法的作用就是替换源字符串中特定字符为指定的字符,验证代码如下:
1 String str = "ababababab";2 String str1 = "c";3 str = str.replace("aba", str1); //替换str中aba为c4 System.out.println(str);
System打印出来的结果就是:cbcbab,也就是说:在索引0处检测到了aba,替换成了c,然后再从索引3处进行检测,而不是索引1处,以此类推
总结:
由此,可以看出来在编写searchString()进行字符串检测时,检测到了就应该跳到+目标字符串长度的索引位置,而不是简单的当前索引+1
搜索引擎如此,jdk也是如此,这也就是应该遵循的规则,除非你有什么特殊的需要!