複習筆記11 循環 以及優化

import java.util.ArrayList;



public class Test12
{
	public static void main(String[] args)
	{
		//先判斷後執行
		int x = 0;
		while(x < 3)
		{
			System.out.println(x++);
		}
		System.out.println("===============================>");
		
		//先執行後判斷
		do
		{
			System.out.println(--x);
		}
		while(x > 0);
		System.out.println("===============================>");
		
		for (x = 0; x < 3; x++)
        {
	        System.out.println(x);
        }
		System.out.println("===============================>");
		
		//for循環可以聲明多個變量,以及複雜的布爾表達式,和循環結尾操作
		for(int i = 0, j = 0; i != 0 && j != 0; i++, j++);
		
		//同樣的for循環的第三個表達式也允許執行其他代碼,而非簡單的i++
		for (int i = 0; i < 3; System.out.println(i++));
		System.out.println("===============================>");
		//這種方式也不錯,同樣也可以,但要注意第一個表達式僅運行一次
		//但要這麼寫就成了do while了。。。
		for (System.out.println(x); x > 0; System.out.println(--x));
		System.out.println("===============================>");
		
		//這種寫法是不行的,for的第一個表達式只支持相同類型的多變量聲明
		//並且,如果第一個表達式爲聲明變量,後邊將不能在添加初始化的執行
		//代碼了
//		for (int i = 0,long j = 0; i < 3; i++);
//		for (int i = 0,System.out.println(i); i < 3; i++);
		
		//for循環中的複雜布爾表達式,也應該對其進行優化,比如下方的代碼
		//當i=2執行完後,i++變成3,仍然會進行判斷,i>0成立,i<3時纔會
		//跳出循環
		for (int i = 0; i > 0 && i < 3; i++);
		//所以正確的做法應該是這樣,在3<3時,直接跳出,當然這裏應該是
		//直接i<3一個就行,只不過爲了說明情況,比如嵌套循環裏
		for (int i = 0; i < 3 && i > 0; i++);
		
		//比如說輸出1-10中每一個奇數到10之間的所有數
		//例如,
		//第一步輸出 123456789
		//第二步輸出 3456789
		for (int i = 0; i < 10; i++, System.out.println())
			//這裏以i=0爲例,j就需要判斷10次是不是小於10,而奇數判斷呢?
			//也要判斷10次,總共是20次,在加上最後的一次小於10,總21次
//			for (int j = i; j < 10 && i % 2 == 1; System.out.print(j++));
			//還是以i=0爲例,先奇數判斷,需要11次,而i小於10呢?需要5次
			//總共是16次判斷,少了5次
			for (int j = i; i % 2 == 1 && j < 10; System.out.print(j++));
		System.out.println("===============================>");
		
		//這段代碼看起來毫無問題,事實上很多人覺得list.size更靠譜一些
		//但是由於size方法每次的調用都會耗費額外的時間,所以嚴重影響
		//效率
		ArrayList<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < list.size(); i++);
		//這種方式就要好多的,循環內應該儘量避免取值固定的方法調用,應該
		//在循環外部定義成變量來保存,以節省循環內的時間消耗來提高效率
		int size = list.size();
		for (int i = 0; i < size; i++);
		
		//這種方式會導致每次循環都創建以及銷燬變量,對於循環內的變量來說
		//應該定義在循環外部,像重構代碼一樣,對於循環內的變量也要重用
		for (int i = 0; i < 5; i++)
		{
			int tmp = i;
			tmp = tmp * 2;
		}
		//比如這個樣子
		int tmp;
		for (int i = 0; i < 3; i++)
        {
	        tmp = i;
	        tmp = tmp * 2;
        }
		
		//這段代碼看起來很符合邏輯,也沒有錯誤,但效率會很低,原因在節點深度
		//的問題,是jvm的問題
		for (int i = 0; i < 10; i++)
			for (int j = 0; j < 10000; j++);
		//這樣效率會提高特別多,尤其是你的內循環裏代碼操作比較多的情況,但有
		//一點,這也不是萬能的,比如2維數組,就可能導致數據訪問錯誤,而如果
		//整個2維數組都改變排列方式,可能也不太好理解了,畢竟人都習慣了從左上
		//開始看矩陣
		for (int j = 0; j < 10000; j++)
			for (int i = 0; i < 10; i++);
		
		//這是foreach循環,也就是支持迭代的集合,包括數組都可以這樣來寫,但
		//實際上所有的for編譯器編譯之後都是while循環,它的功能是取出集合中的
		//每一個元素
		for (Integer integer : list);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章