Java 如果,否则如果,否则

Java 如果,否则如果,否则,java,Java,假设我有两个字符串可以作为参数传递: String one = "one"; String two = "two"; 以下哪种方法最有效 private void exampleOne(String example){ if(example.equals("one"){ // do this }else{ // do this } } private void exampleTwo(String example){

假设我有两个字符串可以作为参数传递:

String one = "one";
String two = "two";
以下哪种方法最有效

private void exampleOne(String example){
     if(example.equals("one"){
         // do this
     }else{
         // do this
     }
}

private void exampleTwo(String example){
     if(example.equals("one"){
         //do this
     }else if(example.equals("two"){
         // do this
     }
}


private void exampleThree(String example){
     if(example.equals("one"){
         // do this
     }
     if(example.equals("two"){
         // do this
     }
}

从统计学上讲,使字符串比较最少的一个,即

if (example.equals("one"){
    // do this
} else {
    // do this
}

第一个一个。因为你不必检查其他情况。换句话说,你需要做更多的操作

效率最高的:1、2、3

但是,如果您必须检查
i==0
,您会期望其中大多数都是
=
如果(i!=0){}否则{}比
if(i==0){…}


让一切尽可能简单

我会说第一个,只是因为它每次只需要计算一个表达式…

我会说第一个,因为如果它只说没有条件的else,那么它就不需要检查任何东西,直接进入“else”

我会比较各种方法的效率,如果它们具有相同的功能。目前,这三种方法在功能上都有所不同。因此,没有必要对它们进行比较

  • exampleOne()
    -如果example等于
    “one”
    ,则执行
    。对所有其他值执行
    else

  • exampleTwo()
    -如果example等于
    “一”
    ,则执行
    If
    。如果
    ,则执行
    ,如果它等于
    “两个”
    ,否则对于所有其他值,不执行任何操作-(这里有一个区别)

  • exampletree()
    -好吧,这一个(目前的情况)与第一个大致相同,只是有一个额外的比较,顺便说一句,就效率而言,这不会有多大影响。但是,有可能两个
    if
    语句都会在此方法中执行,如果在两个
    if
    语句之间,您将字符串
    “两个”
    分配给
    示例
    ,这在
    示例一
    方法中是不可能的。更清楚地说,这里有两个独立的
    if
    块,而在第一个方法中,它是
    if-else
    块(只执行其中一个)


  • 在我看来,第二个,因为你可以直接控制这两种情况。当Sring为“一”和“二”时


    在示例一中,该方法不关心是否传递了“2”或“3”。它只关心情况,如果“一”通过了

    < p>没有一个是最有效率的,因为你只有两个选项,你应该考虑这个值不是一个而不是两个,也许另一个(空?null),所以你应该写下这样的东西:

     if(example.equals("one"){
         //do this 1
     }else if(example.equals("two"){
         // do this 2
     }else{
        // do this 3
     }
    

    理论上,第一种方法最有效。 实际上,您应该选择第二种,因为它提供了更好的可读性和可维护性

    记住,过早优化是万恶之源:)

    1)效率最高,但这不利于可维护性

    private void exampleOne(String example){
         if(example.equals("one"){
             // do this
         }else{
             // do this
         }
    }
    
    private void exampleTwo(String example){
         if(example.equals("one"){
             //do this
         }else if(example.equals("two"){
             // do this
         }
    }
    
    2) 第二,效率高,但有利于可维护性

    private void exampleOne(String example){
         if(example.equals("one"){
             // do this
         }else{
             // do this
         }
    }
    
    private void exampleTwo(String example){
         if(example.equals("one"){
             //do this
         }else if(example.equals("two"){
             // do this
         }
    }
    
    3) 第三效率

    private void exampleThree(String example){
         if(example.equals("one"){
             // do this
         }
         if(example.equals("two"){
             // do this
         }
    }
    

    这些集团无法进行比较,你也无法说明它们中最好的是什么,因为它们在每种情况下的流动是不同的

    这个集团提供了两条途径,一条是积极的,另一条不是

    private void exampleOne(String example){
         if("one".equals(example){ //deciosn
             // path positive
         }else{
             // path negative 
         }
    }
    
    此块提供三条路径:正、负、正、负

    private void exampleTwo(String example){
         if("one".equals(example){
             //path positive
         }else {
            // path negative 
            if("two".equals(example{
             // path negative-positive 
            }
         }
    }
    
    此块提供四条路径:正、负和正-负

    private void exampleThree(String example){
         if("pne".equals(example){ 
             // path positive
         }
         if("two".equals(example){
             // path positive
         }
    }
    
    正如您看到的,您有四段不同的代码,您不应该将它们与更高效的代码进行比较

    private void exampleThree(String example){
         if(example.equals("one"){
             // do this
         }
         if(example.equals("two"){
             // do this
         }
    }
    
    你应该关注背后的算法,而不是它的外观

    提示:


    尝试在比较的左侧使用常量,这样可以避免诸如取消引用和无效赋值之类的问题

    我不知道你需要什么,所以,这里你有我的意见

    第一个,总是只做一次检查。。因此,在这个特定的例子中,它将是一个比较少的例子

    第二个,最坏情况下会做两个比较,一个是“一”,一个是“两”,但是。。。(总是有a,但是)如果字符串为,则不会有任何作业,比如说“三”(在第一个示例中,它将转到else)

    3个示例将始终进行2次比较,如果在ifs中输入返回值,则不进行比较

    所以,我的观点是,没有足够的信息来说明哪一个更为理想

    一句忠告:你可以试试,如果。。。要使用像这样的案例:

    switch (true) {
            case example.equals("one"):  
                     break;
            case example.equals("two"):  
                     break;
    
            default: 
                     break;
    }
    

    显然,与参数的可能值相比,第一种方法将是最有效的方法,因为其他方法中的附加if条件是无用的,并且与您的情况无关。(额外条件检查==>效率较低)

    为什么不尝试在每个方法的开头和结尾添加System.currentTimeInMillis(),并调用它一百万次呢PElse if几乎总是更高效。一旦你找到一根火柴,你就会输掉剩下的。但不管怎样,每个IF都将进行处理。给定的实现在结果方面是不同的,所以这不是效率的问题。该代码示例与其他代码示例不同,这里没有可能的答案。不,代码不同,但规范说明了两个可能的字符串。我不同意第3点。看起来不一样,但事实并非如此。在1中有两条逻辑路径,在3中有四条。@Vash这就是为什么我说大致相同,但不完全相同。我已经在第3点的最后一句中解释了差异。为什么b)比c)更有效?在汇编程序中,2)需要比3)多跳一次,如果我没记错我的汇编时间……3)如果示例为“1”,则调用两个字符串#equals,而2)调用一个。