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

++ii++ 的区别

  • ++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 语法格式:
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
hqxstudying5 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·13 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
大数据CLUB30 分钟前
基于spark的奥运会奖牌变化数据分析
大数据·hadoop·数据分析·spark
春生野草32 分钟前
关于SpringMVC的整理
spring
Edingbrugh.南空40 分钟前
Hadoop高可用集群搭建
大数据·hadoop·分布式
智慧化智能化数字化方案1 小时前
69页全面预算管理体系的框架与落地【附全文阅读】
大数据·人工智能·全面预算管理·智慧财务·智慧预算
Bug退退退1231 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
武子康1 小时前
大数据-33 HBase 整体架构 HMaster HRegion
大数据·后端·hbase
Zz_waiting.1 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象