0

为什么这样做:

public String delDel(String str) {
if(str.length() >= 4 && str.substring(1,4).equals("del")){    
        String front = str.substring(0,1);
        String back = str.substring(4, str.length());
        return front + back;
    }
    else{
        return str;
    }
}

这不起作用:

public String delDel(String str) {
if((str.substring(1,4).equals("del")) && str.length() >= 4){    
        String front = str.substring(0,1);
        String back = str.substring(4, str.length());
        return front + back;
    }
    else{
        return str;
    }
}

如果您注意到第一个和第二个之间的区别是 str.length() 在第一个条件的其余部分之前,它是第二个条件的最后一个条件。

4

2 回答 2

4

差异表明短路评估。

在 Java 中,使用布尔运算符&&,如果第一个操作数是 ,则不会计算第二个操作数false。当能够评估的第二个操作数取决于第一个条件时,这种差异至关重要true

第一个代码示例:

if(str.length() >= 4 && str.substring(1,4).equals("del")){    

仅当长度为 4 时才会评估第二部分。如果长度不是至少 4,substring则将失败并返回StringIndexOutOfBoundsException. 但它不能,因为如果长度至少为 4,那么调用是有效的。

第二个代码示例:

if((str.substring(1,4).equals("del")) && str.length() >= 4){    

substring现在无论长度如何,都将始终评估对的调用,因此可以 throw StringIndexOutOfBoundsException

即使是JLS 第 15.23 节,也有关于这个主题的说法:

条件与运算符 && 类似于 &(第 15.22.2 节),但仅当其左侧操作数的值为真时才计算其右侧操作数。

此外,||根据JLS 第 15.24 节,条件或运算符的工作方式类似:

条件或运算符 || 运算符就像 | (§15.22.2),但仅当其左侧操作数的值为假时才评估其右侧操作数。

于 2013-10-30T00:01:43.823 回答
1

第二个条件可能不起作用的原因是,当str4字符短时,您将看到第二个条件失败。然而,第一个条件可以防止这种情况发生,因为当长度小于 时,&&运算符不会计算。substr4

于 2013-10-29T23:59:47.907 回答