01、算术运算符
- 用于基本数学运算。
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | int a = 5 + 3; | a = 8 |
- | 减法 | int b = 10 - 4; | b = 6 |
* | 乘法 | int c = 2 * 6; | c = 12 |
/ | 除法 | double d = 10.0 / 3; | d ≈ 3.333 |
% | 取模(求 余数) | int e = 10 % 3; | e = 1 |
++ | 自增 | int x = 5; x++; | x = 6 |
– | 自减 | int y = 5; y–; | y = 4 |
- 注意:
- 1、++ 和 – 可前置或后置:
- 2、整数除法,会直接去掉结果中的小数部分,返回一个整数结果(不是四舍五入)。
public class JavaOperator {
/**
* 算术运算符
*/
public static void arithmeticOperator(){
int a = 5 + 3;
System.out.println(a);
int b = 10 - 4;
System.out.println(b);
int c = 2 * 6;
System.out.println(c);
double d = 10.0 / 6;
System.out.println(d);
// 直接舍弃小数部分(不是 四舍五入)。
int e = 10 / 6;
System.out.println(e);
int f = 10 % 3;
System.out.println(f);
int g = 5;
int h = g++;
System.out.println(h);
int i = 5;
int j = ++i;
System.out.println(j);
int k = 5;
int l = k--;
System.out.println(l);
int m = 5;
int n = --m;
System.out.println(n);
}
}
02、赋值运算符
- 为变量赋值。
运算符 | 含义 | 示例 | 等价于 |
---|---|---|---|
= | 直接赋值 | int a = 5; | - |
+= | 加后赋值 | a += 3; | a = a + 3; |
-= | 减后赋值 | a -= 2; | a = a - 2; |
*= | 乘后赋值 | a *= 4; | a = a * 4; |
/= | 除后赋值 | a /= 2; | a = a / 2; |
%= | 取模后赋值 | a %= 3; | a = a % 3; |
&= | 位与后赋值 | a &= b; | a = a & b; |
|= | 位或后赋值 | a |= b; | a = a | b; |
^= | 位异或后赋值 | a ^= b; | a = a ^ b; |
<<= | 左移后赋值 | a <<= 2; | a = a << 2; |
>>= | 右移后赋值 | a >>= 1; | a = a >> 1; |
>>>= | 无符号右移后赋值 | a >>>= 1; | a = a >>> 1; |
03、关系运算符
- 用于比较两个值的关系,返回布尔值 true/false。
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
== | 等于 | 5 == 3 | false |
!= | 不等于 | 5 != 3 | true |
> | 大于 | 5 > 3 | true |
< | 小于 | 5 < 3 | false |
>= | 大于等于 | 5 >= 5 | true |
<= | 小于等于 | 5 <= 3 | false |
04、逻辑运算符
- 用于布尔逻辑运算。
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
&& | 逻辑与(短路) | (5 > 3) && (2 < 4) | true |
|| | 逻辑或(短路) | (5 < 3) || (2 < 4) | true |
! | 逻辑非 | !(5 < 3) | true |
- 非短路逻辑运算符(不建议用于布尔值):
运算符 | 含义 | 示例 | 行为 |
---|---|---|---|
& | 逻辑与(非短路) | (false) & (x++ > 0) | 右侧仍执行 |
| | 逻辑或(非短路) | (true) | (y-- < 0) | 右侧仍执行 |
- 注意:
- 短路特性:&& 和 || 若左侧可确定结果,右侧不执行:
- 非短路行为:& 和 | 会对两侧表达式均求值(即使左侧已确定结果)。
- 通常用于位运算,逻辑场景 不推荐使用。
int x = 5;
// 短路特性
boolean result = (false && (x++ > 0)); // x 不自增,result = false
- & :按位与:只要有一个为 false,则直接返回 false 。
- | :按位或:只要有一个为 true,则直接返回 true 。
- ~ :按位非:如果为 true,则返回 false,如果为 false,则返回 true 。
- ^ :按位异或:如果两个操作数相同,则返回 false,如果两个操作数不同,则返回 true
05、位运算符
- 直接操作二进制位(仅用于整数类型)。
运算符 | 含义 | 示例(二进制) | 结果(二进制) |
---|---|---|---|
& | 按位与 (同时为 1 ,才位 1) | 5 & 3 (101 & 011) | 001 (1) |
| | 按位或 (有一个为 1 就为 1 ) | 5 | 3 (101 | 011) | 111 (7) |
^ | 按位异或 (一个为 1 一个为 0 ,才位 1) | 5 ^ 3 (101 ^ 011) 5 ^ 5 (101 ^ 101) | 110 (6) 000 (0) |
~ | 按位取反 | ~5 (补码取反) | -6(具体依赖位数) |
<< | 左移 | 5 << 1 (101 → 1010) | 10 |
>> | 带符号右移 | -5 >> 1 (保留符号位) | -3 |
>>> | 无符号右移 | -5 >>> 1(高位补 0 ) | 大正数(依赖位数) |
- >>:
- 正整数:有符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
- 负整数:有符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 1 ,低位溢出舍弃。
- >>>:
- 正整数:无符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
- 负整数:无符号右移 n 位,结果的补码等于在原来补码的高位补了 n 个 0 ,低位溢出舍弃。
/**
* 右移
*
* @param n
*/
public static void signedRightShift(int n) {
System.out.println(n + " 的有符号右移...........");
System.out.println("参数的二进制补码是:" + Integer.toBinaryString(n));
// 有符号右移三位
int a = n >> 3;
System.out.println("结果的二进制补码是:" + Integer.toBinaryString(a));
System.out.println("十进制结果是:" + a);
System.out.println();
}
/**
* 无符号右移
*
* @param n
*/
public static void unsignedRightShift(int n) {
System.out.println(n + " 的无符号右移...........");
System.out.println("参数的二进制补码是:" + Integer.toBinaryString(n));
// 无符号右移三位
int a = n >>> 3;
System.out.println("结果的二进制补码是:" + Integer.toBinaryString(a));
System.out.println("十进制结果是:" + a);
System.out.println();
}
public static void main(String[] args) {
/*
11 的有符号右移...........
参数的二进制补码是:1011
结果的二进制补码是:1
十进制结果是:1
*/
signedRightShift(11);
/*
11 的无符号右移...........
参数的二进制补码是:1011
结果的二进制补码是:1
十进制结果是:1
*/
unsignedRightShift(11);
/*
-11 的有符号右移...........
参数的二进制补码是:11111111111111111111111111110101
结果的二进制补码是:11111111111111111111111111111110
十进制结果是:-2
-2 的补码是:11111111111111111111111111110
*/
signedRightShift(-11);
System.out.println("-2 的补码是:" + Integer.toBinaryString(536870910));
System.out.println();
/*
-11 的无符号右移...........
参数的二进制补码是:11111111111111111111111111110101
结果的二进制补码是:11111111111111111111111111110
十进制结果是:536870910
536870910的补码是:11111111111111111111111111110
*/
unsignedRightShift(-11);
System.out.println("536870910的补码是:" + Integer.toBinaryString(536870910));
System.out.println();
// 二进制位,相同则为 0, 不同则为 1 。 所以,输出:5^5 = 0
System.out.println("5^5 = " + (5^5));
}
06、条件运算符(三元运算符 / 三目运算符)
- 简化条件判断的表达式。
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
?: | 条件表达式 | int max = (a > b) ? a : b; | 返回较大值 |
07、其它运算符
1、 instanceof – 模式匹配
- 检查对象是否属于某个类:
String name = "James";
// 由于 name 是 String 类型,所以返回真
boolean result = name instanceof String;
- Java16 之前的使用:
if (staff[i] instanceof Manager) {
Manager boss = (Manager)staff[i];
boss.setBonus(000);
}
- Java16 的使用:
- 声明变量 的 instanceof 形式称为“模式匹配”。
- 因为,它类似于 switch 中的类型模式(Java17 才有)。
if (staff[i] instanceof Manager boss) {
boss.setBonus(000);
}
2、 new
- 创建对象实例:
Object obj = new Object();
3、 . (成员访问)
- 访问对象的属性或方法:
String s = "Hello";
int len = s.length(); // len = 5
4、 [] (数组访问)
- 访问数组元素:
int[] arr = {1, 2, 3};
int num = arr[0]; // num = 1
08、运算符 的 优先级
- 从高到低(部分常见运算符):
- ()、[]、.
- !、~、++、–
- *、/、%
- +、-
- <<、>>、>>>
- <、>、<=、>=、instanceof
- ==、!=
- &、^、|
- &&、||
- ?:
- =、+=、-= 等复合赋值运算符
09、5 * 4 最快的运算方式是?
- 位运算 5<< 2 。
10、什么情况下,加号会变成 字符串连接符?
- “+” 号左右,一边为 String 类型时,则变成字符连接符。
- 第一个输出:
- 首先, 10 和 20 被视为数字,相加为 30。
- 然后,30 被视为字符串,并与字符串 Javatpoint 连接。因此,输出将为 30Javatpoint。
- 第二个输出:
- 字符串 Javatpoint 与 10 连接成字符串 Javatpoint10,然后与 20 连接成 Javatpoint1020。
class Test {
public static void main (String args[]) {
// 输出结果:30Javatpoint
System.out.println(10 + 20 + "Javatpoint");
// 输出结果:Javatpoint1020
System.out.println("Javatpoint" + 10 + 20);
}
}
- 第一个输出:
- 首先,将数字 10 和 20 相乘。
- 然后,将结果 200 视为字符串并与字符串 Javatpoint 连接以生成输出 200Javatpoint。
- 第二个输出:
- 数字 10 和 20 将首先乘以 200,因为乘法的优先级高于加法。
- 结果 200 将被视为字符串,并与字符串 Javatpoint 连接,以生成 Javatpoint200 的输出。
class Test {
public static void main (String args[]) {
// 输出结果:200Javatpoint
System.out.println(10 * 20 + "Javatpoint");
// 输出结果:Javatpoint200
System.out.println("Javatpoint" + 10 * 20);
}
}