算术运算符
加法运算符(+):执行加法操作
减法运算符(-):执行减法操作
乘法运算符(*):执行乘法操作
除法运算符(/):用于执行除法操作
取模运算符(%):用于获取除法运算的余数
特别要注意的是除法可能会发生细节丢失,比如整型i=5,整型c=2,i/c按照我们人类的逻辑本来是2.5的,但是由于除数和被除数都是整型,计算机会默认将计算结果也视为是整型,然后去接收,如果发现计算结果是小数,那么计算机就会向下取整,也就是2.5之下最大的整数,也就是2。
代码示例
public class Main {
public static void main(String[] args) {
int i=5;
int c=2;
System.out.println("加法 "+(i+c));
System.out.println("减法 "+(i-c));
System.out.println("乘法 "+(i*c));
System.out.println("除法 "+(i/c));
System.out.println("除法(转换类型后)"+(double)i/c);
System.out.println("取模 "+(i%c));
}
}
运行结果
逻辑运算符
逻辑与运算符(&&):如(条件1&&条件2),当&&的左边条件与右边条件都为真时,返回真,但凡有一个条件是假都会返回假
逻辑或运算符(||):如(条件1||条件2),当||的左边条件与右边条件都为假时,返回假,但凡有一个条件是真,它就返回真
逻辑非运算符(!):如(!条件),在条件前加上,英文符的感叹号会将条件状态反转,也就是说本来条件是真的,但返回的布尔值是假,条件为假,则返回真。这里废话一下,在之后的学习中,我发现有些教程中说能不写非就尽量不用写,非写多了会导致代码可读性下降很多,又有些教程说在多个条件限制下的判断可以用非,这样的开发效率更高。具体咋样安排这个逻辑非运算的使用频率我还不太清楚。
代码示例
public class Main {
public static void main(String[] args) {
//假设有两个条件,条件x是真,条件y是假
boolean x = true;
boolean y = false;
boolean andResult = x && y; // false
boolean orResult = x || y; // true
boolean notResult = !x; // false
System.out.println("逻辑与(x && y)="+andResult);
System.out.println("逻辑或(x || y)="+orResult);
System.out.println("逻辑非(!x)="+notResult);
}
运行结果
相等运算符
相等运算符(==):比如(某个数据1==另一个数据),它用于比较左右两边的操作数是否相等,相等则返回真,否则返回假,它既可以用来比较基本数据类型,也可以用来比较引用数据类型(也就是后来会学的对象,不过这里有坑,慎用)
简单解释一下所说的坑:对于比较引用数据类型,该运算符比较的是左边与右边的数据是否引用同一个对象,,即它们的内存地址(这个内存地址的具体意义我还不太清楚,我把它理解为就算机储存数据的硬件的位置编号)是否相等。这个坑很无聊,但考试会考的花样百出,再废话几句,虽然都说JAVA中没有指针,但我感觉这个引用和指针差别不大。
代码示例
public static void main(String[] args) {
//基本数据类型比较
int a = 5;
int b = 5;
boolean result1 = (a == b); // true
//引用数据类型比较
String str1 = "Hello";
String str2 = "Hello";
boolean result2 = (str1 == str2); // true
//坑
String str3 = new String("Hello");
String str4 = new String("Hello");
boolean result3 = (str3 == str4); // false
System.out.println("result1="+result1);
System.out.println("result2="+result2);
System.out.println("result3="+result3);
}
运行结果
位运算符
这个是我觉得最难理解的运算符,我感觉经常用这种运算符编程的人应该是大佬,在学习JAVA基础中我也只是在JAVA的计算HashCode(哈希值)的底层源码中看到过。
位是之前计算机储存时就提到过的单位,也就是说位运算符操作的是二进制位而不是操作的值,尽管位运算符能做出的计算基本上都能用算术运算符替换,但它对底层数据的高效处理与位级操作的能力是算术运算符无法企及的。
按位与(&):对两个操作数的每个位执行逻辑与操作,并返回每个对应位上的结果(两个操作数的对应位上都为 1 的位返回1)
按位或(|):对两个操作数的每个位执行逻辑或操作,并返回每个对应位上的结果(两个操作数的对应位上有任何一个位为 1 的位,返回1)
按位异或(^):对两个操作数的每个位执行逻辑异或操作,并返回每个对应位上的结果(两个操作数的对应位上只有一个位为 1 的位)
按位取反(~):对两个操作数的每个位执行逻辑非操作,并返回每个对应位上的结果(将0变为1
0变为1)
左移(<<):将操作数的二进制位向左移动指定的位数,并在右侧用0填充
右移(>>):将操作数的二进制位向右移动指定的位数,根据最左边的符号位进行填充
无符号右移(>>>):将操作数的二进制位向右移动指定的位数,使用零进行填充
字面解释这些真的感觉好苍白,说了等于没说,还是建议看视频
代码示例
int a = 5;
int b = 3;
int bitwiseAnd = a & b; // 1
int bitwiseOr = a | b; // 7
int bitwiseXor = a ^ b; // 6
int bitwiseNot = ~a; // -6 (补码表示)
int leftShift = a << 1; // 10
int rightShift = a >> 1; // 2
int unsignedRightShift = a >>> 1; // 2
调试结果
补充一下,0b为前缀的数字表示这是二进制字面常量,后面的8位则表示的是正常的8位二进制数,至于bitwiseNot的表示可能与补码相关,这里没搞明白,但int型是四字节在这是能看出来的。
具体解释
-
按位与(
&
):a
的二进制表示为00000101
b
的二进制表示为00000011
a & b
的二进制表示为00000001
(1)- 结果为 1,表示两个操作数的对应位上都为 1 的位
-
按位或(
|
):a
的二进制表示为00000101
b
的二进制表示为00000011
a | b
的二进制表示为00000111
(7)- 结果为 7,表示两个操作数的对应位上有任何一个位为 1 的位
-
按位异或(
^
):a
的二进制表示为00000101
b
的二进制表示为00000011
a ^ b
的二进制表示为00000110
(6)- 结果为 6,表示两个操作数的对应位上只有一个位为 1 的位
-
按位取反(
~
):a
的二进制表示为00000101
~a
的二进制表示为11111010
(补码,-6)- 结果为 -6,表示将操作数的每个位取反
-
左移(
<<
):a
的二进制表示为00000101
a << 1
的二进制表示为00001010
(10)- 结果为 10,表示将操作数的二进制位向左移动一位,右侧用零填充空位
-
右移(
>>
):a
的二进制表示为00000101
a >> 1
的二进制表示为00000010
(2)- 结果为 2,表示将操作数的二进制位向右移动一位,根据最左边的符号位进行填充
-
无符号右移(
>>>
):a
的二进制表示为00000101
a >>> 1
的二进制表示为00000010
(2)- 结果为 2,表示将操作数的二进制位向右移动一位,使用零进行填充
三元运算符
(条件?值1:值2):三元运算符也成为条件表达式运算符,假如条件为真则返回值1,条件为假则返回值2
我觉得这个运算符的意义就是简洁代码,毕竟谁喜欢看到那么多的if-else
总结
目前我在学习JAVA基础的过程中只接触了这些运算符,欢迎大家为我补充其他运算符的知识(*^▽^*)