3 判断语句与循环语句
限于篇幅,这里就不对Java语言中的所有语句进行介绍了,仅介绍两种常用的语句:判断语句与循环语句。
3.1 判断语句
在Java语言中判断语句有三种:if 判断语句、condition ? value1 : value2 判断语句与switch 判断语句。
在书写if 判断语句时,特别是在通过“==”做比较判断时,不要将其误写为“=”。例如:
... ... boolean isTrue = false; if (isTrue = true) { ... } ... ...
上面的代码在编译时,编译器是不会报错的,但是这却不是所期望的,因为它把比较、判断语句写成了赋值语句,怎样避免这种情况的发生呢?你可以将true 或false 写在表达式的前面,如:
... ... boolean isTrue = false; if (true == isTrue) { ... } ... ...
这样就可以避免上面错误的产生,当然上面的这种书写格式很少被使用。
另外一个方面就是不要在判断语句之前给条件变量误赋值,造成判断语句下面的代码“不可达”,例如:
... ... isTrue = false; ... if (! isTrue) { ... } else { ... } ... ...
在上面的语句中,if 语句的条件(!isTrue) 永远为真,因此后续else 子句的代码就变成不可到达的代码分支,这种错误是非常严重的逻辑错误,会影响整个应用程序的正确运行并且不易被发现,因此提醒你一定要注意这个问题。
condition ? value1 : value2 判断语句较为简洁,适用于单一分支判断,返回适合条件值的情况,也就是非此即彼,对于多分支的判断是不能采用的。
Switch 判断语句适用于分支较多的情况,虽然可以使用if else 语句嵌套实现,但是代码显得有些冗长,格式不明快。关于switch 语句的书写格式在本文前面的章节中讨论过,在此不再赘述。
3.2 循环语句
Java语言中的循环语句也分为三种:for 循环、while 循环和 do while 循环。
for 循环
不可在for 循环体内修改循环变量的值,防止for 循环失去控制。例如:
for (int i = 0; i < m; i++) { ... m++; ... }
因为你在循环体中不断地增加m的数值,使其无限增大,这样就导致了死循环的产生,或者你在循环体中修改了递进步长变量的值,如:
for (int i = 0; i < m; i++) { ... i--; ... }
同样也会导致死循环的产生,因此在书写for 循环语句时应该尽量注意这一点。另外如果在for 循环语句中步进因子(如上例中的i)的步长不是1,假设是2,此时应该特别注意for循环的书写方式,如:
for (int i = 0; i < m; i+2) { ... }
同样程序也跳不出循环体了,这是因为表达式 i+2并没有给i 赋值,因此i 的值并没有伴随循环体不断增加,正确的书写可以有下面两种方式:
for (int i = 0; i < m; i+=2) { ... } 或者, for (int i = 0; i < m;) { ... i = i + 2; }
这样就可以很好地避免上面错误的发生,导致死循环的产生。另外一个需要注意的地方是最终条件值(如上例中的m)应该是步进因子步长的整数倍。
在for 循环中我们应该尽量使用整型数作为步进因子变量的值,使用整型数比使用字节或短整型数更为高效。因为当我们采用字节或短整型数做步进因子变量的值时,系统将隐式地把它们转化为整型数,因此耗费了循环的执行时间,降低了系统性能。
while 循环
while 循环是较为常用的一种循环体格式,当我们不知道具体的循环次数时不采用for 循环而采用while 循环,while 循环每进行一次循环都要先验证一下条件是否满足,如果满足则执行循环体中的代码,否则跳出循环体。
如果你在进入while 循环之前误操作了其条件值,又可能产生死循环或根本无法进入while 循环体,如:
... ... // 误操作的赋值语句 condition = true; ... ... // 这里就会产生死循环 while (condition) { ... } ... ...
再者,
... ... // 误操作的赋值语句 condition = false; ... ... // 永远不能执行while 循环体内的代码 while (condition) { ... } ... ...
因此应该特别注意避免上面提到的误为循环条件赋值情况的发生。
do while 循环
do while 循环与while 循环类似,与之不同的是do while 循环至少可以进入循环体一次,这是由其自身的逻辑决定的,因为do while 循环是在执行一次循环后再验证条件是否成立,而while 循环则是先验证条件然后再进入循环,while 循环与do while 循环的验证与循环的逻辑分别如图3-1 和图3-2 所示。
因此,在采用do-while 循环格式时,一定要注意是否真的允许在不做任何判断的情况下进入循环体,以免产生逻辑错误。
使用循环语句的几个建议
(1)当做数组拷贝操作时,采用System.arraycopy()方法完成拷贝操作要比采用循环的办法完成数组拷贝操作效率高,下面的例子向你展示了其不同:
public class ArrayCopyTest { public static void main(String args[]) { long startIndex, endIndex; int[] a = new int[2500000]; int[] b = new int[2500000]; for (int i = 0; i < a.length; i++) { a[i] = i; } startIndex = System.currentTimeMillis(); for (int j = 0; j < a.length; j++) { b[j] = a[j]; } endIndex = System.currentTimeMillis(); System.out.println(endIndex - startIndex + " milli seconds for loop copy "); int[] c = new int[2500000]; startIndex = System.currentTimeMillis(); System.arraycopy(a, 0, c, 0, c.length); endIndex = System.currentTimeMillis(); System.out.println(endIndex - startIndex + " milli seconds for System.arraycopy() "); } }
编译并运行这个程序,输出信息如下:
105 milli seconds for loop copy
45 milli seconds for System.arraycopy()
可见其性能差别还是比较大的,采用System.arraycopy()方法完成拷贝操作要比采用循环的办法完成数组拷贝操作效率高1倍左右。
(2)尽量避免在循环体中调用方法,因为方法调用是比较昂贵的。
(3)最好避免在循环体内存取数组元素,比较好的办法是在循环体内采用临时变量,在循环体外更改数组的值。这是因为在循环体内使用变量比存取数组元素要快。
(4)当没有使用JIT或HotSpot虚拟机时,尽量使用0值作为终结条件的比较元素,以提高循环语句的性能,例如:
public class ZeroCompareTest { public static void main (String args[]) { long startIndex, endIndex; int[] a = new int[2500000]; startIndex = System.currentTimeMillis(); for (int i = 0; i < a.length; i++) { a[i] += i; } endIndex = System.currentTimeMillis(); System.out.println(endIndex - startIndex + " 毫秒(不采用零值比较)"); int[] b = new int[2500000]; startIndex = System.currentTimeMillis(); for (int i = b.length - 1; i >= 0; i--) { b[i] += i; } endIndex = System.currentTimeMillis(); System.out.println(endIndex - startIndex + " 毫秒(采用零值比较)"); } }
编译并执行这个例子,其输出信息如下:
16毫秒(不采用零值比较)
0毫秒(采用零值比较)
由此可见,使用0值作为终结条件的比较元素在很大程度上提高循环语句的性能。
(5)避免在做最终条件比较时采用方法返回值的方式进行判断,这样做将增大系统开销,降低系统性能,如:
... ... while (isTrue()) { ... } ... ...
如果按照上面的书写方式,每循环一次应该调用一次方法isTrue(),因此你最好采用下面的方式:
... ... boolean isTrue = isTrue(); while (isTrue) { ... } ... ...
(6)尽量避免在循环体中使用try-catch 块,最好在循环体外使用try-catch 块以提高系统性能,例如:
do { try { ... } catch (Exception ex) { ... } } while(isTrue);
上面的代码在你每执行一次循环的时候,都要做try-catch 检验,增大系统开销,正确的书写方式如下所示。
try { do { ... } while(isTrue); } catch (Exception ex) { ... }
这样在整个循环中只做一次try-catch 检验,避免了上面问题的出现,降低了系统开销,提高了系统性能。
(7)在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减少循环层间的切换次数,如:
for (int i = 0; i < 1000; i++) { for (int j = 0; j < 20; j++) { ... } }
正确的书写方式为:
for (int j = 0; j < 20; j++) { for (int i = 0; i < 1000; i++) { ... } }
(8)如果循环体内有if-else 类逻辑判断,并且循环次数很大,最好将if-else 类逻辑判断移到循环体之外,以提高应用性能。如:
for (int i = 0; i < 1000000; i++) { if (isTrue) { doThis(); } else { doThat(); } }
正确的书写方式为:
if (isTrue) { for (int i = 0; i < 1000000; i++) { doThis(); } } else { for (int i = 0; i < 1000000; i++) { doThat(); } }
这与上面的第6点建议类似,很容易理解,因为第一种书写方式比第二种书写方式多执行了999999次逻辑判断。并且由于前者总是进行逻辑判断,如果循环次数非常少,两者效率差别并不明显,采用第一种书写方式比较好,因为这种书写方式使程序更加简洁。
发表评论
-
【JAVA优化编程】表达式、语句与保留字之——(4)正则表达式
2011-03-12 20:46 04 正则表达式 正则表达式对于熟悉脚本语言 ... -
【JAVA优化编程】表达式、语句与保留字之——(2)Java语言中的保留字
2011-03-08 23:02 9302 Java语言中的保留字 任何一种语言都 ... -
【JAVA优化编程】表达式、语句与保留字之——(1)表达式
2011-03-05 11:52 775表达式与语句是任何程序设计语言的基础,也是开发大型软件 ... -
【JAVA优化编程】内存管理之——(10)Java程序设计中有关内存管理的其他经验
2011-02-18 17:36 109710 Java程序设计中有关 ... -
【JAVA优化编程】内存管理之——(9)JVM内存参数调优
2011-02-18 16:38 10869 JVM内存参数调优 我们前面所提到的堆内存( ... -
【JAVA优化编程】内存管理之——(8)不要提前创建对象
2011-02-13 16:54 9568 不要提前创建对象 尽量在需要的时候创建 ... -
【JAVA优化编程】内存管理之——(7)瞬间值
2011-02-13 16:41 9647 瞬间值 相信你在做远程方法调用 ... -
【JAVA优化编程】内存管理之——(6)对象重用与GC
2011-02-13 16:08 13646 对象重用与GC 有时候我们为了提高系统 ... -
【JAVA优化编程】内存管理之——(5)共享静态变量存储空间
2011-02-11 13:29 13275 共享静态变量存储空间 我们知道类中的静 ... -
【JAVA优化编程】内存管理之——(4)数组的创建
2011-02-11 11:35 8134 数组的创建 ... -
【JAVA优化编程】内存管理之——(3)Java中的析构方法finalize
2011-02-11 11:01 14223 Java中的析构方法finalize ... -
【JAVA优化编程】内存管理之——(2)JVM中对象的生命周期
2011-02-10 16:07 11082 JVM中对象的生命周期 在J ... -
【JAVA优化编程】内存管理之——(1)垃圾回收
2011-02-10 15:04 892内存管理的话题在 ...
相关推荐
在Java编程语言中,`for`循环是一种常用的控制流程结构,用于执行一系列语句多次,通常根据特定条件来决定何时停止。`for`循环的基本语法包括三个表达式:表达式1(初始化)、表达式2(条件检查)和表达式3(更新)...
pythone 33个保留字及其含义正文可以用代码查询python到底有哪些保留字注意: 正文 序号 保留字 含义 1 and 用于表达式运算,逻辑与操作 2 as 用于类型转换 3 assert 断言,用于判断变量或条件表达式的值...
在Java编程语言中,保留字(Reserved Words)和关键字(Keywords)是两个非常重要的概念,它们构成了Java语法的基础。保留字是Java语言已经预定义并赋予特定含义的词汇,而关键字则是Java语法结构中不可或缺的部分。...
- `goto`是Java中的保留字,但目前Java语言并没有实现这个关键字,因此在Java程序中无法使用`goto`。 3. **&和&&的区别**: - 逻辑运算符`&`和`&&`都可以用于布尔逻辑运算。两者都会检查两边的表达式,但`&&`具有...
内容概要:《Java语言基础》资源为读者提供了Java语言编程的基础知识和概念,通过一系列实例教程,引导学习者掌握Java程序的基本结构、特殊语句、变量与数据类型、标识符与关键字、运算符与表达式以及流程控制语句。...
非法的标识符包括以数字开头、保留字以及Java的关键词。 理解这些基本概念是掌握Java编程的关键。在编写Java程序时,需要注意数据类型的选用、正确使用表达式和控制流,以及恰当的异常处理,这将有助于编写出高效、...
在编程实践中,避免与这些关键字和保留字冲突,可以减少语法错误,提高代码质量,并确保程序的兼容性和可维护性。同时,采用合适的命名约定,如匈牙利类型标记法,也有助于团队成员更好地理解代码的意图和数据类型。
在条件判断和循环控制中,“elif”和“else”分别用于if语句和循环语句(for和while)中的其他条件分支;“if”用于条件判断语句;“else”作为if语句的可选部分,表示条件不满足时执行的代码块。 此外,“exec”...
### 良好的Java编程习惯:提升代码质量与可维护性 #### 1. 遵循KISS原则,保持代码简洁 优秀的Java程序应当遵循KISS(Keep It Simple, Stupid)原则,即保持代码的简单性和直接性。避免使用过于复杂或奇特的语法...
Java是一种广泛使用的面向对象的编程语言,其语法严谨,其中包括一系列的关键字和保留字,这些关键字在编程中具有特殊含义,不能用作变量名或其他标识符。以下是对Java中一些重要关键字的详细解释: 1. **abstract*...
对于Java这门广泛使用的面向对象编程语言而言,理解其关键字与保留字的含义及用途至关重要。本文将详细介绍Java中的关键字和保留字,并探讨它们在程序开发中的应用。 #### 二、Java关键字详解 Java关键字是对Java...
(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO,RETURN 运算符 +=,-=,++,-- (2)修改单词:不等号# 改为 (3)增加条件语句的ELSE子句 2. 课程设计 基本内容(成绩范围:“中”、“及格”或“不及格”) (1)...
- **初始化数组**:可以通过直接赋值或循环语句等方式初始化数组元素。 - **访问数组元素**:如`array[0]`表示第一个元素。 - **数组长度**:数组的长度可通过`.length`属性获取。 #### 2.5 控制结构 控制结构用于...
其中,语句①的循环变量的步长为1,语句②的循环变量的步长为-1。 选做内容: (1)增加运算:++ 和 --。(实现) (2)增加类型:① 字符类型; ② 实数类型。(未实现) (3)扩充函数:① 有返回值和返回语句;...
Java中的条件语句(如if、switch)和循环语句(如for、while、do...while)用于控制程序的流程。Java中的break语句可以用来跳出当前循环,而continue语句用于跳过当前循环的剩余部分并开始下一次循环。 Java中的...
1. 增加单词:保留字 ELSE,FOR,TO, DOWNTO 运算符 +=,- =,++,- - 修改单词:不等号# 改为 <> 2. 增加条件语句的ELSE子句 3. 扩充赋值运算 += 和 -= 4.扩充语句(Pascal的FOR语句): ①FOR <变量>:=...
- **用途**:保留字,Java中未使用。在C++中用于声明常量。 11. **continue** - **用途**:用于跳过循环体中的剩余部分,并继续下一次迭代。 12. **default** - **用途**:在`switch`语句中,当没有匹配的...
在Python应用开发中,while循环语句是一种基本的控制流程结构,用于重复执行一段代码,直到特定条件不再满足。在Python中,while循环遵循以下格式: ```python while condition: # 循环体(执行的代码块) body ...
Java语言程序设计中的第二章主要聚焦于数据类型与表达式,这是编程的基础概念。首先,我们来了解一下Java中的标识符规则。合法的Java标识符必须遵循一定的命名规范,例如,A. counterl 和 D. _byte 是合法的,因为...