算术运算符 有哪些?
Java 中的算术运算符,包括以下几种:
算术运算符 | 名称 | 举例 |
---|---|---|
+ | 加法 | 1 + 2 = 3 |
- | 减法 | 2 - 1 = 1 |
* | 乘法 | 2 * 3 = 6 |
/ | 除法 | 12 / 3 = 4 |
% | 求余 | 13 % 3 = 1 |
++ | 自增1 | i = 1; i++; i=2; |
– | 自减1 | i = 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