java中equals()和startsWith()之间的区别

use*_*948 -1 java recursion equals startswith

我正在使用codingBat练习练习递归以获得自己的娱乐.我正在做这个练习:

给定一个字符串,递归计算字符串中出现小写"hi"的次数,但是不计算在它们之前立即有"x"的"hi".

countHi2("ahixhi") ? 1
countHi2("ahibhi") ? 2
countHi2("xhixhi") ? 0
Run Code Online (Sandbox Code Playgroud)

我试图做这个代码,但它不断抛出超出范围的异常:

public int countHi2(String str){    
    if(str.length()<2){
        return 0;
    }
    else if(str.substring(0,3).equals("xhi")){
        return countHi2(str.substring(3));
    }
    else if(str.substring(0,2).equals("hi")){
        return 1+countHi2(str.substring(2));
    }
    else{
        return countHi2(str.substring(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

我更改了substring()并等于startsWith()

else if(str.startsWith("xhi")){
            return countHi2(str.substring(3));
Run Code Online (Sandbox Code Playgroud)

现在效果很好,有人可以指出为什么我的第一个代码不正确吗?startsWith()和equals()之间有区别吗?

zmb*_*mbq 6

首先,确保字符串中至少包含2个字符,然后测试前三个字符是否为xhi.String.substr如果字符串不够长则抛出异常.

String.startsWith没有这个问题,当你检查2个字符的字符串是否以3个字符开头时它不会抛出异常 - 它只是返回false.