美文网首页
Java 面试系列:Java 中的运算符和流程控制 + 面试题

Java 面试系列:Java 中的运算符和流程控制 + 面试题

作者: you的日常 | 来源:发表于2021-02-03 17:38 被阅读0次

    算术运算符

    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 语法格式:

    相关文章

      网友评论

          本文标题:Java 面试系列:Java 中的运算符和流程控制 + 面试题

          本文链接:https://www.haomeiwen.com/subject/uemebktx.html