您的位置:首页 > 编程语言 > Java开发

java 基础 流程控制

2014-04-07 10:09 316 查看
鄙人不才,基础不好,趁着闲时简单学习一下,仅作学习分享,如有不正确地方还请各位看客不吝指出。

Java流程主要可以分为:

顺序(可以按照正常顺序一步步往下运行的)

选择(三元操作符[?:];if else;switch)

循环(for;while;do while;)

控制(break;continue;)

顺序流程没啥好说的,代码没问题的话一般都可以按顺序运行

选择流程中

1.之前在论坛中有看的别人说三元操作符不会进行短路操作,这个说法其实是错误的

例如

int i = 1;
int j = i==2 && ++i == 2?1:2;
System.out.println(i);
System.out.println(j);

2.为什么有了三元操作符还要有ifelse呢?有人说三元操作符不能嵌套,这个显然是不正确。

上面的例子第二行改成.

int j = i==2 && ++i == 2?1:(i>3?3:2);

也是可以正常运行的。可是这样做程序的可读性就很差了。个人认为ifelse主要是为了提高程序可读性存在的。

3.效率方面,直接写程序观察运行时间是不靠谱的,这与你电脑运行时环境关系很大。但是我们可以用javap进行反编译进行查看的

public class Test{
	
	public void test()
	{
		int i = 1;
		int j;
		j = i==1?1:2;
	}
	
}

首先运行 javac Test.java进行编译,然后运行javap -c Test 进行反编译。 得到如下结果

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":
()V
       4: return

  public void test();
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: iconst_1
       4: if_icmpne     11
       7: iconst_1
       8: goto          12
      11: iconst_2
      12: istore_2
      13: return
}

同样的方法测试ifelse

public class Test{
	
	public void test()
	{
		int i = 1;
		int j;
		if (i==1)
		{
			j = 1;
		}
		else
		{
			j = 2;
		}
	}
	
}

反编译后

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":
()V
       4: return

  public void test();
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: iconst_1
       4: if_icmpne     12
       7: iconst_1
       8: istore_2
       9: goto          14
      12: iconst_2
      13: istore_2
      14: return
}

可以发现ifelse比三元操作符多一行,这个只是对j赋值时多出的一步操作,如果不计算jvm加载class文件的时间,ifelse 和三元操作是没有任何效率差别的。

4.关于switch要点

a.匹配类型包括 byte、short、char、int、enum[jdk1.5]、String[jdk1.7]

b.根据需求,不要丢掉必要的break

循环流程

1.如何选用循环?

a.for循环用来处理已知循环次数的需求

b.while循环用来处理已知循环终止条件的需求

c.do while循环用来处理在判断是否终止前必须运行一次的需求

2.注意事项

a.小心死循环

b.小心起始和结束条件是否包含

c.注意平衡时间复杂度和物理复杂度(尤其是面试时的那些排序算法)

3.关于jdk5 加入的新特性foreach

要想使用foreach的对象必须实现Comparable接口

控制流程

流程控制break;(终止当前所在循环,只能中的一层循环),continue;(从此处中断,开始下一次循环)

break和contine配合标签使用

break 标签; continue 标签;

使用方法和前面说的类似,但是不仅限于当前循环,而是从标签处进行处理



简单用法示例

public class BaseType {
	
	public static void main(String[] args) {
		int count = 0;
		
		for(int i = 0; i<100;i++)
		{
			breaker:
			for(int j = 0;j<100;j++)
			{
				for(int k = 0;k<100;k++)
				{
					count++;
					if (k>50)
					{
						break breaker;
					}
				}
			}
		}
		
		System.out.println(count );
	}

}




流程控制差不多就这些,没有提到的地方可以回复补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: