關於初學Java所遇到的一系列問題

關於初學Java所遇到的一系列問題

問題1:關於for循環中執行了continue 語句之後,後面的i++還是否執行的問題

例如有這樣一段代碼:

int i;
for (i = 0; i < 5; i++) {
	if (i == 4)
		continue;
}

這個for循環結束後 i 的值還是5,在 i 等於4的時候執行了continue但並沒有跳過最後的i++。如果又有這樣一段代碼:

int i = 0;
while (i < 5) {
	if (i == 4)
		continue;
	i++;
}

這段代碼的運行結果是死循環。因爲 i 等於4的時候執行了continue語句,從而跳過了後面的i++語句,進入了下一次循環,此時 i 的值還是4,所以會一直死循環下去。
這就需要注意while循環和for循環在使用時的區別。

問題2:對於返回值爲boolean 類型的方法的書寫技巧

/**
* 判斷一個年份是否爲閏年
* @param year 一個int型的年份
* @return true 是閏年 , false 不是閏年
*/
public boolean isLeapYear(int year) {
	return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

這個方法是要判斷一個年份是否爲閏年,而且返回值是一個boolean類型的值。首先,判斷一個年份是否爲閏年的表達式本身就是一個boolean類型的值,所以就沒有必要再寫if – else 結構來判斷了,直接返回這個表達式的值就是最終的答案。這樣寫手法巧妙而且結構簡單。

問題3:將問題進行拆分解決的思想

例如有這樣一個題目:利用循環結構輸出如下圖形。
###*###
##*#*##
#*###*#
*#####*
#*###*#
##*#*##
###*###
這個圖形看起來比較複雜,猛地一看好像找不到頭緒,這時就需要分部分來解決問題。首先把整個圖形的上下分爲兩個部分,分別爲菱形的上半部分和下半部分。現在只看上半部分,又可以分爲左右兩個小部分,現在只看左上角的一個小部分,利用二重循環可以輕鬆找出這其中的對應關係。然後將剩餘的三個小部分也做這樣的分析,最後組合到一起,完成整個圖形的輸出。

public void printRhombusF(int n) {
	char[][] image = new char[n][n];
	
	for (int i = 0; i < n / 2; i++) {
		for (int j = 0; j < n; j++) {
			if (n / 2 - i == j || n / 2 + i == j) {
				image[i][j] = '*';
			} else {
				image[i][j] = '#';
			}
		}
	}
	for (int i = n / 2; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i - n / 2 == j || n - (i - n / 2) - 1 == j) {
				image[i][j] = '*';
			} else {
				image[i][j] = '#';
			}
		}
	}
		
	//打印輸出二維數組
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			System.out.print(image[i][j]);
		}
		System.out.println();
	}
}

啓發:要學會充分利用拆分解決問題的方法,把大問題化解爲一系列小問題,思路就會清晰得多。

問題4:關於方法的文檔註釋書寫。

/**
* 對於當前方法的整體解釋,方法的分析過程,利害關係
*
* @param argumentName參數名字 對於當前參數的功能解釋,提一些要求. 有多少個參數就需要完成多少@param
* @return 返回值解釋,數據類型,返回值的含義,狀態,要求。
*/

書寫文檔註釋能夠生成註釋文檔,有利於提高自己以及所有使用者對於代碼功能和用法的瞭解。書寫註釋文檔要嚴格按照格式來書寫,每一個方法都要寫好文檔註釋。

問題5:關於方法的封裝問題

方法的封裝並不是隨意的,需要遵循一定的規則,如何能夠封裝出一個好的方法是一個重點問題。

  1. 方法的功能要單一化,要考慮後期的複用性,可移植性等問題。
  2. 儘量避免書寫黑盒方法(無返回值的方法),對於有返回值的方法中要減少return的使用,要符合結構化的編程思想,提高代碼閱讀性,避免結構混亂。
  3. 找出特定的情況優化代碼,提高運行效率,同時提高代碼的閱讀性。

問題6:靈活運用特殊情況,提高算法的性能

例題:將一個正整數進行分解質因數操作,將分解結果輸出。

public static void primeNumber(int num) {
	System.out.print(num + "=");
	//num被i整除後不需要再從2開始除,從當前的i開始除即可
	for (int i = 2; i <= num; i++) {
		if(num % i == 0 && num != i) {
			num /= i;
			System.out.print(i + "*");
			i -= 1; 
		}
		if(num == i) {
			System.out.print(i);
			break;
		}
	}
}

用上述算法就已經能夠解決這個問題,但在這個基礎上還能做一些優化,使得算法的執行效率更高。循環中的i完全沒有必要從2遍歷到num,而且循環中也沒必要加過多的判斷語句,每當i能夠整除num時就輸出i,並將num/i,如果直到i增到小於Math.sqrt(num)的最大整數時,這說明最後能夠整除num就只有num本身了,那麼就沒有必要在循環裏做冗餘的判斷,直接在循環結束之後輸出當前的num值即可。代碼如下:

public static void primeNumber(int num) {
	System.out.print(num + "=");
	//num被i整除後不需要再從2開始除,從當前的i開始除即可
	for (int i = 2; i < Math.sqrt(num); i++) {
		if(num % i == 0) {
			num /= i;
			System.out.print(i + "*");
			i -= 1; 
		}
	}
	System.out.println(num);
}

以後每一週的學習都會做一個這樣的問題總結,也希望能幫助到和我有同樣疑問的小夥伴們。如果有什麼錯誤還望小夥伴們指出,謝謝!

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