Java 中的运算符和流程控制
Java 中的运算符和流程控制 + 面试题
算术运算符
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
运算过程:如果布尔表达式的值为 true,则返回 表达式 1 的值,否则返回 表达式 2 的值。
例如:
String s = 3 > 1 ? "三大于一" : "三小于一";
System.out.println(s);
执行结果:三大于一
。
流程控制
在 Java 语言中使用条件语句和循环结构来实现流程控制。
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 循环
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);
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,所以循环就永远不会停下来。
4 多重选择
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 关键字。
相关面试题
1. Java 中 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
2. 以下代码 i 的值是多少?
int i = 0;
i = i++;
System.out.println(i);
答:i=0
题目解析:因为 Java 虚拟机在执行 i++ 时,把这个值有赋值给了 i,而 i++ 是先赋值再相加,所以这个时候 i 接收到的结果自然是 0 了。
3. 以下代码 i2 和 i3 的值分别为多少?
int i = 0;
int i2 = i++;
int i3 = ++i;
答:i2=0,i3=2
4. 以下代码能不能正常执行?
if (true) System.out.println("laowang");
答:可以正常执行,其中判断条件的括号不能省略,大括号是可以省略的(作者并不建议为了省代码的而牺牲代码的可读性)。
5. 以下 switch 执行的结果是什么?
int num = 1;
switch (num) {
case 0:
System.out.print("0");
case 1:
System.out.print("1");
case 2:
System.out.print("2");
case 3:
System.out.print("3");
default:
System.out.print("default");
}
答:123default
6. switch 能否用于 byte 类型的判断上?能否用于 long 类型的判断上?
答:switch 支持 byte 类型的判断,不支持 long 类型的判断。
题目解析:switch 支持的全部类型(JDK 8):char、byte、short、int、Charachter、Byte、Short、Integer、String、enum。
7. while 必须配合 break 一起使用的说法正确吗?
答:错误,while 可以单独使用。
例如:
int i = 0;
while (i < 3) {
System.out.println(++i);
}
8. 以下代码可以正常运行吗?为什么?
int i = 0;
while (i < 3) {
if (i == 2) {
return;
}
System.out.println(++i);
}
答:可以正常运行,这里的 return 和 break 的效果是一致的,while 可以配合 return 或 break 一起使用。
9. 以下的程序执行结果什么?
int i = 0;
do {
System.out.println(++i);
} while (i < 3)
答:编译器报错,do/while 之后必须使用分号 ;
结尾。
10. 以下程序输出的结果是?
String s = new String("laowang");
String s2 = new String("laowang");
System.out.println(s == s2);
switch (s) {
case "laowang":
System.out.println("laowang");
break;
default:
System.out.println("default");
break;
}
A:true,default
B:false,default
C:false,laowang
D:true,laowang
答:C
11. 以下代码循环执行了几次?
for (float i = 0; i != 10; i += 0.1) {
System.out.println("hi");
}
答:无数次,循环永远不会停下来。由于舍入误差,因为 0.1 无法精确的用二级制表示,所以上面代码到 0.9000001 之后,会直接跳到 1.0000001,不会等于 1,所以循环就永远不会停下来。
12. 以下代码输出的结果是?
int num = -4;
System.out.println(num % 2 == 1 || num % 2 == -1);
A:1
B:-1
C:true
D:false
答:D
题目解析:-4 % 2 = 0 既不等于 1 也不等于 -1,所以结果为 false。
13. 以下代码输出的结果是?
int num = 4;
num = ((num & 1) == 1);
System.out.println(num);
A:4
B:1
C:以上都不是
答:C
题目解析:== 运算返回的是 boolean 类型,不能使用 int 接收,所以程序会报错。
欢迎关注我的公众号,回复关键字“Java” ,将会有大礼相送!!! 祝各位面试成功!!!
Java 中的运算符和流程控制的更多相关文章
- java 基础one ---运算符and流程控制
首先java这个了解下java的基础 首先java文件都是以.java结尾的 然后 他所有的内容都是有一个入口的就是放在了public static void main(String [] args ...
- 【JAVA零基础入门系列】Day5 Java中的运算符
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- python基础02—运算符与流程控制
运算符与流程控制 运算符 赋值运算 用'='表示,'='的左边只能是变量 算术运算 +.-.*:加.减.乘 /:除法运算,运算结果为浮点数 //:除法运算,运算结果为整数(商) %:求余 **:求幂 ...
- Lua的五种变量类型、局部变量、全局变量、lua运算符、流程控制if语句_学习笔记02
Lua的五种变量类型.局部变量.全局变量 .lua运算符 .流程控制if语句 Lua代码的注释方式: --当行注释 --[[ 多行注释 ]]-- Lua的5种变量类型: 1.null 表示 ...
- python 运算符与流程控制
运算符与流程控制 运算符 赋值运算 用'='表示,'='的左边只能是变量 算术运算 +.-.*:加.减.乘 /:除法运算,运算结果为浮点数 //:除法运算,运算结果为整数(商) %:求余 **:求幂 ...
- 格式化输出的三种方式,运算符及流程控制之if判断
''' 格式化输出的三种方式,运算符及流程控制之if判断 ''' # 格式化输出的三种方式 # 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式 比如要求用户输入用户名和年龄 ...
- Python-基本运算符与流程控制
目录 基本运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 身份运算符 位运算符 成员运算符 运算符优先级 流程控制 if 判断 单分支结构 双分支结构 多分支结构 while 循环 while ...
- JavaScript运算符与流程控制
JavaScript运算符与流程控制 运算符 赋值运算符 使用=进行变量或常量的赋值. <script> let username = "YunYa"; < ...
随机推荐
- __FILE__,__LINE__,__DATE__,__TIME__,__FUNCTION__的使用
C/C++ 有5个常用的预定义宏,可以当作变量直接使用 __FILE__,__FUNCTION __,__LINE__,__DATE__,__TIME__. 注意是两个下划线. 其含义如下: __FI ...
- 【题解】HDU5845 Best Division (trie树)
[题解]HDU5845 Best Division (trie树) 题意:给定你一个序列(三个参数来根),然后请你划分子段.在每段子段长度小于等于\(L\)且子段的异或和\(\le x\)的情况下最大 ...
- $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$
$Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...
- Hadoop以及组件介绍
一.背景介绍 在接触过大数据相关项目的时候常常都会听到Hadoop这个东西,简单来说,他是一个用分布式计算来处理大数据的开源软件,下面包含了许多的组件和子项目,这篇文章将会介绍Hadoop的原理以及一 ...
- 深入理解linux i节点(inode)
转载自:https://blog.csdn.net/vsooda/article/details/9216245 linux中,文件查找不是通过文件名称来查找的.实际上是通过i节点来实现文件的查找定位 ...
- 当Parallel遇上了DI - Spring并行数据聚合最佳实践
分析淘宝PDP 让我们先看个图, Taobao的PDP(Product Detail Page)页. 打开Chrome Network面板, 让我们来看taobao是怎么加载这个页面数据的. 根据经验 ...
- Web漏洞总结: OWASP Top 10
本文原创,更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 开发安全 - OWASP Top 10 在学习安全需要总体了解安全趋势和常见的Web漏洞,首推了解OWASP,因为它代表着业 ...
- CF749D Leaving Auction set排序查找
CodeForces 749D. Leaving Auction 传送门 There are n people taking part in auction today. The rules of a ...
- 【转】安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少
本文由 ImportNew - 唐尤华 翻译自 gigavoice.如需转载本文,请先参见文章末尾处的转载要求. 除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的 ...
- python判断是否是质数
质数:只能被1和它自身整除 # 获取用户输入的数,判断是否是质数 num = int(input('输入一个任意的大于1的整数:')) i=2 # 创建一个变量,记录是否是质数,默认num是质数 fl ...