2.12号Java复习题目——Java 中的运算符和流程控制(基础知识)
Posted LeoLRH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.12号Java复习题目——Java 中的运算符和流程控制(基础知识)相关的知识,希望对你有一定的参考价值。
1.运算符
1.1 算术运算符
Java 中的算术运算符,有七种:
算术运算符 | 名称 | 举例 |
---|---|---|
+ | 加法 | 1+2=3 |
- | 减法 | 2-1=1 |
* | 乘法 | 2*3=6 |
/ | 除法 | 24/8=3 |
% | 求余 | 24%7=3 |
++ | 自增1 | int i=1;i++ |
-- | 自减1 | int i=1;i-- |
重点记忆的是 “++” 和 “--”,其他的算术运算符相对比较简单直观,之所以要把 “++” 和 “--” 单独拿出来讲,是因为在使用他们的时候有很多坑需要开发者注意,最重要的是 “++” 和 “--” 也是面试中高频出现的面试题。
代码如下:
int i = 1; int i2 = ++i; // ++i 相当于 i = 1+i; System.out.println(i); // 2 System.out.println(i2); // 2
++i
和 i++
的区别
++i
先自加再赋值i++
先赋值再自加
代码验证:
int i = 0; int i2 = i++; int j = 0; int j2 = ++j; System.out.println("i2=" + i2); System.out.println("j2=" + j2);
输出的结果:
i2=0
j2=1
代码解析:i++
是先给 i2 赋值再自身 +1 ,所以 i2 等于0,而 ++j
是先自加等于 1 之后,再赋值给 j2,所以 j2 等于 1。
注意事项
++/-- 是非线程安全的,也就是说 ++/-- 操作在多线程下可能会引发混乱,代码如下:
new Thread() { @Override public void run() { for (int i = 0; i < 100000; i++) { System.out.println("thread:" + this.getName() + ",count=" + (++count)); } } }.start(); new Thread() { @Override public void run() { for (int i = 0; i < 100000; i++) { System.out.println("thread:" + this.getName() + ",count=" + (++count)); } } }.start();
执行的结果,如下图:
如上图所示,每台机器的执行可能略有差距,但大多数情况下并不能给我们想要的真实值 200000。
原理分析
“++” 操作在多线程下引发混乱的原因:因为 ++ 操作对于底层操作系统来说,并不是一条 CPU 操作指令,而是三条 CPU 操作指令——取值、累加、存储,因此无法保证原子性,就会出现上面代码执行后的误差。
如何避免 ++/-- 操作在多线程下的“误差”?
- 方法一:++/-- 操作放在同步块 synchronized 中。
- 方法二:自己申明锁,把 ++/-- 操作放入其中。
- 方法三:使用 AtomicInteger 类型替代 int 类型。
因为 -- 的语法和 ++ 完全一致,所以 -- 的操作,请参照上面的 ++ 语法。
1.2 条件运算符(三元运算符)
条件运算符(?:)也叫“三元运算符”。
语法:
布尔表达式 ? 表达式1 :表达式2
运算过程:如果布尔表达式的值为 true,则返回 表达式 1 的值,否则返回 表达式 2 的值。
代码如下:
String s = 3 > 1 ? "三大于一" : "三小于一";
System.out.println(s);
执行结果:三大于一
。
2. 流程控制
在 Java 语言中使用条件语句和循环结构来实现流程控制。
2.1 条件语句
条件语句的语法格式:
if(......) ......
其中的条件判断必须使用括号括起来不能省略。
代码如下:
int i = 1; if (i > 1) { System.out.println("i大于一"); } else if (i == 1) { System.out.println("i等于一"); } else { System.out.println("其他"); }
2.2 循环
while 当条件成立的时候执行下一条语句。
while 语法格式:
while(......) ......
代码如下:
int i = 0; while (i < 3) { System.out.println(++i); }
while 是先判断再决定是否执行,有可能一次也不执行,如果希望至少执行一次,可以使用 do/while。
do/while 语法格式:
do{......}while(......);
代码如下:
int i = 0; do { System.out.println(++i); } while (i < 3);
确定循环
for 循环是程序中最长使用的循环之一,它是利用每次迭代之后更新计数器来控制循环的次数。
for 语法格式:
for(int i=0;i<n;i++){ ...... }
代码如下:
for (int i = 0; i < 10; i++) { System.out.println("i=" + i); }
for 循环中可使用关键字 continue,跳过后续操作,继续下一次迭代。
代码如下:
for (int i = 1; i < 4; i++) { if (i == 2) continue; System.out.println("i=" + i); }
执行结果:
i=1
i=3
如结果所示,第二次循环就会跳过,执行下一次循环。
for 注意事项
在循环中检查两个浮点数是否相等要格外小心,代码如下:
public static void main(String[] args) { for (float i = 0; i != 1; i += 0.1) { System.out.println(i); } }
循环永远不会停下来,由于舍入误差,因为 0.1 无法精确的用二级制表示,所以上面代码到 0.9000001 之后,会直接跳到 1.0000001,不会等于 1,所以循环就永远不会停下来。
多重选择
switch 的特点是可以判断多个条件,if 的特点是执行少量判断,它们两个刚好形成互补的关系。
switch 语法格式:
switch(......){ case 1: ...... break; ...... default: ...... break; }
switch 代码如下:
int i = 3; switch (i) { case 1: System.out.println("等于1"); break; case 2: System.out.println("等于2"); break; case 3: System.out.println("等于3"); break; default: System.out.println("等于其他"); break; }
可用于 case 的类型有:
- byte、char、short、int
- 枚举
- 字符串(Java SE 7 新加入)
switch 注意事项
switch 使用时,每个选项最末尾一定不要忘记加 break 关键字,否则会执行多个条件。
代码如下:
int i = 1; switch (i) { case 1: System.out.println("等于1"); case 2: System.out.println("等于2"); case 3: System.out.println("等于3"); default: System.out.println("等于其他"); }
程序执行的结果:
等于1
等于2
等于3
等于其他
所以使用 switch 时,每个选项的末尾一定得加 break 关键字。
以上是关于2.12号Java复习题目——Java 中的运算符和流程控制(基础知识)的主要内容,如果未能解决你的问题,请参考以下文章
1.31号Java复习题目——Java的基本数据类型和包装类(面试题刷题)