关于初学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);
}

以后每一周的学习都会做一个这样的问题总结,也希望能帮助到和我有同样疑问的小伙伴们。如果有什么错误还望小伙伴们指出,谢谢!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值