‹4› Java面试必备知识点:『运算符』

算术运算符 有哪些?

Java 中的算术运算符,包括以下几种:

算术运算符名称举例
+加法1 + 2 = 3
-减法2 - 1 = 1
*乘法2 * 3 = 6
/除法12 / 3 = 4
%求余13 % 3 = 1
++自增1i = 1; i++; i=2;
自减1i = 1; ++i; i=2;

++i 和 i++ 的区别是什么?

  • ++i:先自加,再赋值。
  • i++:先赋值,再自加。
int i = 0;
int i2 = i++;
int j = 0;
int j2 = ++j;
System.out.println("i2=" + i2); // 0
System.out.println("j2=" + j2); // 1

代码解析:i++ 是先给 i2 赋值再自身 +1 ,所以 i2 等于0,而 ++j 是先自加等于 1 之后,再赋值给 j2,所以 j2 等于 1。

++ / – 是线程安全的吗?

++/-- 是非线程安全的

因为 ++ 操作对于底层操作系统来说,并不是一条 CPU 操作指令,而是三条 CPU 操作指令——取值、累加、存储,因此无法保证原子性。

例如下面代码:

// 变量
static int count = 0;

public static void main(String[] args) throws Exception {
    
    // 线程一
    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 ? "true" : "false";
System.out.println(s); // true

运算符:

1. 以下代码输出的结果是?

int num = -4;
System.out.println(num % 2); 
System.out.println(num % -2); 
System.out.println(num / 2);
System.out.println(num / -2);

答:0 0 -2 2

++:

1.以下代码 i 的值是多少?

int i = 0;
i = i++;

答:i=0

题目解析:因为 Java 虚拟机在执行 i++ 时,把这个值有赋值给了 i,而 i++ 是先赋值再相加,所以这个时候 i 接收到的结果自然是 0 了。

2.以下代码 i2 和 i3 的值分别为多少?

int i = 0;
int i2 = i++;
int i3 = ++i;

答:i2=0,i3=2

&:

& 运算:

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

二进制:
在这里插入图片描述

1.以下代码输出的结果是?

int num = 4;
num = ((num & 1) == 1);
System.out.println(num);

A:4
B:1
C:以上都不是

答:C

题目解析:(num & 1)是将十进制的整数转换成二进制,然后进行与运算。

== 运算返回的是 boolean 类型,不能使用 int 接收,所以程序会报错。

2.以下代码输出的结果是?

int num = 3;
System.out.println(num & 0); // 0011 & 0000 = 0000
System.out.println(num & 1); // 0011 & 0001 = 0001
System.out.println(num & 2); // 0011 & 0010 = 0010
System.out.println(num & 3); // 0011 & 0011 = 0011
System.out.println(num & 4); // 0011 & 0100 = 0000
System.out.println(num & 5); // 0011 & 0101 = 0001
System.out.println(num & 6); // 0011 & 0110 = 0010
System.out.println(num & 7); // 0011 & 0001 = 0011

答:0 1 2 3 0 1 2 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值