int num = 0 ;
if(num==1){
System.out.println(num);
}else if(num==2){
System.out.println(num);
}else if(num==3){
System.out.println(num);
}else if(num==0){
System.out.println(num);
}
switch(num){
case 1;
System.out.println(num);
break;
case 2:
System.out.println(num);
break;
case 3:
System.out.println(num);
break;
case 0:
System.out.println(num);
break;
}这种请何况下那个效率高?我认为是switch更好一些,它只会判断一次,if需要判断多次才行所以高,对嘛?

解决方案 »

  1.   

    程序都是从上往下执行的,在没找到符合的条件之前都会一直的判断下去,所以他们两种情况是一样的如果你用的全是if 的话那就是switch更好些了
      

  2.   

    你是else if 其实是一样的
      

  3.   

    一样的,只不过这种业务逻辑,用switch更适合一些
      

  4.   

    List<Limit> lList = new ArrayList<Limit>();
    int num = 5;//第一个
    for(int i = 0 ; i < lList.size();i++){
    if("a".eqauls(lList.get(i).getName)){
         if(num>lList.get(i).getBule){
              System.out.println("Bule");
         }
         if(num>lList.get(i).getYellow&&num<lList.get(i).getOrange){
              System.out.println("Yellow");
         }
         if(num>lList.get(i).getOrange&&num<lList.get(i).getRed){
              System.out.println("Orange");
         }
         if(num>=lList.get(i).getRed){
              System.out.println("Red");
         }
    }
    }
    //第二个
    for(int i = 0 ; i < lList.size();i++){
    if("b".eqauls(lList.get(i).getName)){
         if(num>lList.get(i).getBule){
              System.out.println("Bule");
         }
         if(num>lList.get(i).getYellow&&num<lList.get(i).getOrange){
              System.out.println("Yellow");
         }
         if(num>lList.get(i).getOrange&&num<lList.get(i).getRed){
              System.out.println("Orange");
         }
         if(num>=lList.get(i).getRed){
              System.out.println("Red");
         }
    }
    }
    //第三个
    for(int i = 0 ; i < lList.size();i++){
    if("c".eqauls(lList.get(i).getName)){
         if(num>lList.get(i).getBule){
              System.out.println("Bule");
         }
         if(num>lList.get(i).getYellow&&num<lList.get(i).getOrange){
              System.out.println("Yellow");
         }
         if(num>lList.get(i).getOrange&&num<lList.get(i).getRed){
              System.out.println("Orange");
         }
         if(num>=lList.get(i).getRed){
              System.out.println("Red");
         }
    }
    }------------------------------------------------------------------------------------Map<Limit> lMap = new HashMap<Limit>();
    List<Limit> lList = new ArrayList<Limit>();
    int num = 5;for(int i = lList.size();i>=0 ;i--){
    lMap.put(lList.get(i).getName,lList.get(i));
    }//第一个     if(num>lMap.get("a").getBule){
              System.out.println("Bule");
         }
         if(num>lMap.get("a").getYellow&&num<lMap.get("a").getOrange){
              System.out.println("Yellow");
         }
         if(num>lMap.get("a").getOrange&&num<lMap.get("a").getRed){
              System.out.println("Orange");
         }
         if(num>=lMap.get("a").getRed){
              System.out.println("Red");
         }
    }
    }
    //第二个     if(num>lMap.get("b").getBule){
              System.out.println("Bule");
         }
         if(num>lMap.get("b").getYellow&&num<lMap.get("b").getOrange){
              System.out.println("Yellow");
         }
         if(num>lMap.get("b").getOrange&&num<lMap.get("b").getRed){
              System.out.println("Orange");
         }
         if(num>=lMap.get("b").getRed){
              System.out.println("Red");
         }
    }
    }
    //第三个     if(num>lMap.get("c").getBule){
              System.out.println("Bule");
         }
         if(num>lMap.get("c").getYellow&&num<lMap.get("c").getOrange){
              System.out.println("Yellow");
         }
         if(num>lMap.get("c").getOrange&&num<lMap.get("c").getRed){
              System.out.println("Orange");
         }
         if(num>=lMap.get("c").getRed){
              System.out.println("Red");
         }
    }
    }-------------------------------------------------------------------------------------
    以上2种那个更效率更快一些呢?哪怕是一点点。我觉得第二种的Map会更快一些。少了循环次数和判断啊。大鸟说说吧
      

  5.   

    new 两个时间打印下一不就知道了
      

  6.   

    case 3:
    System.out.println(num); 这里如果不break 还会继续往下执行,所以他们是一样的  都是要判断的   只是 后者清晰
      

  7.   

    每个都有break我只是忘了打而已
    5楼每次打出的时间不一样的,耗时是不一样的所以不准从原理,从底层那个更快?
      

  8.   

     就是因为if(){}else太多了的情况才有了switch(){}
      

  9.   

    if判断多的话(判断的是int和int以下的基本类型)最好用swith处理。
    Map与List是独立的两个接口
    效率都可以把,map是键值对应,应该查找更快!
      

  10.   


    case 3:
     System.out.println(num); 这里如果不break 如果下面的符合条件 还会继续往下执行,(说明还是做判断了) 所以他们执行时间应该是一样的   只是 后者是程序显得清晰
      

  11.   

    请你看清楚好吗?我上面都说了每个都有break不要拿break说毫不。后市清晰,这个你说的没有错。谢谢。具体那个快都说不好?
      

  12.   

    if else

    switch之间没有任何关系一点都没有,如果有人非要说两者可以转换,那么只能说是对于编程人员直接用眼睛来看的话是可以转换的。if-else 如果有M个叠加,条件是你写的第n个,那么会执行n次。

    switch 不管case有多少个,都只是进行一次判断。除非你的编译器把switch又给编译成if-else之后然后再进行下一步编译。
      

  13.   


    忘了说一句,switch判断一次的前提是要在每个case后面记得加上break;否则按顺序依次判断。
      

  14.   

    如此的逻辑,我还是习惯用switch
      

  15.   


    case  加 break   是百分百的事情,,我们就不拿这个说事了。我个人觉得switch  快,  理由一会补上第二个问题,我觉得Map快   理由一会补上。谁有好的意见就说,别说打印时间,那是不准的。
      

  16.   

    你看过 java switch源码实现没,估计就是 if else 啊。只是换了个写法而已。
      

  17.   

    说说我自己的一点意见吧。

    先说Map和List  的问题,就是我在4楼发的问题。
    数据读上来之后  存放到lList之后用过3个for循环进行遍历,在遍历的同时查找名字getName 。进行比对如果是a,equals判断通过就进入到if,  4个IF判断并输出颜色。不管用Map还是List这4个判断是无法避免的,想提高效率只能从外围下手。----------------------------进行了3个for的遍历,和3次 getName()    的判断。
    而且每次for循环的时候也都需要进行一次lList.size()这个方法,它也是好资源的,而且每次循环都需要进行一次并且做判断,之后还要做一次if(equals)  判断。----------------------------------------------
    而第二种呢,只是遍历了一次。而且第二种的for要比第一种lList打的for效率要高。并且在for中没有做判断,直接全部存到Map当中。
    少了for循环和判断的过程,所以我认为第二种高,高多少并不重要。
    ----------------------------有人就会说你还多创建了一个Map对象呢,这种效率我不会算··所以还需要高人出来指点一下···凭感觉说话的朋友就算了···大家给点意见吧··我说的对吗
    ·今天可以是讨论,可以是研究,但是不可以是炮轰。谢谢。
      

  18.   

    我说过打时间并不会是嘴准确的。而且请你想想,这样的细小差别对于JVM来说是很小的,但是它始终还是有差别。打印时间肯定看不出什么来。但是一个项目中,一个请求中存在好几千个,那时候还会有感觉的。我只是不想吧东西忽略掉·算我钻牛角尖也罢··
      

  19.   

    哈哈最后楼主把自己的结论也写出来了,我也来赶个末班车(楼主都分析的差不多了,我都不知道说啥了^_^)
    第一个问题的回答:
     if(条件1) {分支1}; 
      else if(条件n) {分支n} 
      else {分支n+1} 
    嵌套分支语句:其语句格式为:  
      嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用switch实现。switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。 switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化,所以在多路分支时用switch比if..else if .. else结构要效率高。
    ===========*上面部分大都是找到的资料*===========
    个人理解:switch 会比 if..else if .. else 快,怎么个快法就不说了(我也说不上来,太底层没怎么研究),
    但switch 只判断整型值的吧,String等等就判断不了吧,所以if..else if ..else和switch 各有各的好处。第二个问题的回答:
    搂主有回复就不多说了, 
    List 用多个循环及判断来处理,效率上自然要慢了。
    Map  用List一个循环赋值后,再判断减少多个循环及判断次数,我想你就是打印时间上来看也可以看出。
    但搂主给出的 Map 键值是已知的写死的(当然这只是楼主给出的一个试例,只是要我们说下谁快谁慢的问题),在不知的情况下这种方法就不实用了。
    我想说的是效率、占CPU大小不是最主要的,能够解决问题并能够实现、完成要求才是最好的(个人追求效率的除外)。
    原因就是在你还在苦想着少占CPU二个点数的时间,别人已经做出来了。
      

  20.   

    个人认为下载J2EE的新特性对于switch的支持很强大了!
      

  21.   


    这位朋友说的有点意思···Map里面的值是固定了··就是说我给的a,b,c是固定  真是代码也是一样的。辛苦了 写了这么多···在等等,看看还有没有其他高手对此简单问题给点意见。
      

  22.   

    下面好一点,好不了多少,不过结构很清楚,推荐用switchpublic class Main {    public static void main(String[] args) throws Exception {
            int num = 0;
            long is = System.currentTimeMillis();
            for (int i = 0; i < 1000000000; i++) {
                if (num == 1) {
                } else if (num == 2) {
                } else if (num == 3) {
                } else if (num == 0) {
                }
            }
            System.out.println("" + (System.currentTimeMillis() - is));        long ss = System.currentTimeMillis();
            for (int i = 0; i < 1000000000; i++) {
                switch (num) {
                    case 1:
                        break;
                    case 2:
                        break;
                    case 3:
                        break;
                    case 0:
                        break;
                }
            }
            System.out.println("" + (System.currentTimeMillis() - ss));
        }
    }
    /*
    run:多次测试都差不多是这个数
    2906
    2235
    成功生成(总时间:5 秒)
    */
      

  23.   


    我知道这个效率上不会差很多的···对于平台及软件来说OK啊··小项目更没的说··更不会再以··这是一种思想·代码的风格··效率只能提高一点点点··总结··好的代码风格··好的结构··更容易让代码清晰可见。。效率虽然只是高了那么微微的一点点··但是就是高··这个是事实。哪怕只是高1MS ,也是高··所以应该使用第二种形式。