一.运算符的定义
在Java中,运算符是用于操作变量和值的符号,借助运算符能够对数据进行各类运算和操作。
二.运算符
1.算数运算符
算术运算符用于执行基本的数学运算,以下是常见的算术运算符及其示例:
(1)加法运算符 +
整数相加
在对整数类型(byte、short、int、long)使用+运算符时,会进行常规的加法运算。如果操作数中有long类型,结果就是long类型;若没有long类型,结果则为int类型。(此处涉及到的知识为类型提升,自动转换的一种,当范围大的和范围小的进行算数操作时,Java会自动将范围小的数的类型转换为范围比较大的数的类型)
int a = 10; long b = 20l; //代码报错,因为进行了类型提升 //int c = a + b; //代码正确 long d = a + b;浮点数相加
当操作数为float或double类型时,+运算符会进行浮点数加法运算。若操作数中有double类型,结果就是double类型;若只有float类型,结果为float类型(原理和上面一样)
用于字符串的拼接
// 字符串拼接 String str1 = "Hello"; String str2 = " World"; String result = str1 + str2; // result 的值为 "Hello World"在进行字符串的拼接时需要注意,当加法运算符用于字符串拼接时,如果表达式中既有字符串又有其他数据类型,会从左到右依次计算。若先遇到字符串,后续操作数会被自动转换为字符串进行拼接 (下面a和b的计算中,先出现了一个字符串,则按照字符串进行拼接,所以结果为12)
int num = 5; String result = "The number is: " + num; // 正确拼接 int a = 1, b = 2; String str = "" + a + b; // 结果是 "12",而不是 "3"(2)减法运算符 -
减法运算符用于从一个数值中减去另一个数值。(存在和加法运算符同样的类型提升问题)
int num3 = 8; int num4 = 3; int num5 = num3 - num4; // num5 的值为 5(3)乘法运算符 *
乘法运算符用于两个数相乘
int num5 = 4; int num6 = 5; int product = num5 * num6; // product 的值为 20(4)除法运算符 /
除法运算符用于两个数的相除
int num7 = 10; int num8 = 3; int quotient = num7 / num8; // quotient 的值为 3注意事项
当两个操作数都是整数时,结果会自动抛弃小数部分,当两个操作数都是浮点数或者其中一个时浮点数时,结果不会抛弃小数部分
int num7 = 10; int num8 = 3; double num10 = 3; double num11 = 10; double num9 = num7 / num8; double num12 = num7 / num10; double num13 = num11 / num8;(5)取模运算符 %
取模运算符用于计算两个数相除的余数
int num11 = 10; int num12 = 3; int remainder = num11 % num12; // remainder 的值为 1注意事项
取模运算结果的符号与被除数的符号一致。也就是说,不管除数的符号怎样,结果的符号取决于被除数
int a = 10; int b = 3; int Result = a % b; // 结果为 1,因为 10 除以 3 商 3 余 1 System.out.println(Result); int c = -10; int Result1 = c % b; // 结果为 -1,结果符号与被除数 -10 一致 System.out.println(Result1); int d = 10; int e = -3; int Result2 = d % e; // 结果为 1,结果符号与被除数 10 一致 System.out.println(Result2);常用场景
借助取模运算符对 2 取模的结果,能够判断一个整数是奇数还是偶数。若一个数对 2 取模的结果为 0,那么它就是偶数;若结果为 1,则为奇数
(6)自增运算符和自减运算符++ ,--
这两种运算符的作用分别是将变量的值加一和减一
int num13 = 5; int result1 = ++num13; // 前缀自增,num13 先变为 6,再赋值给 result1,result1 的值为 6 int num14 = 5; int result2 = num14++; // 后缀自增,先将 num14 的值 5 赋值给 result2,num14 再变为 6,result2 的值为 5 int num15 = 5; int result3 = --num15; // 前缀自减,num15 先变为 4,再赋值给 result3,result3 的值为 4 int num16 = 5; int result4 = num16--; // 后缀自减,先将 num16 的值 5 赋值给 result4,num16 再变为 4,result4 的值为 5注意事项
注意前缀自增(自减)和后缀自增(自减)的区别,前者是先自增,再赋值,后者则是先赋值,后自增,上述例子已经详细说明
2.赋值运算符
(1)简单的赋值运算符 =
在以前的学习中,=通常被认为的计算两数结果的符号,但在Java中,他的作用是将一个值赋给一个变量
int a = 10;基本数据类型赋值
只需要注意等号左边和右边的数据类型兼容即可,不兼容时可使用强制类型转换
引用数据类型赋值
赋值时,右侧对象的类型要和左侧变量的类型相同或者是其子类型
class Animal {} class Dog extends Animal {} // 正确,Dog 是 Animal 的子类 Animal animal = new Dog(); // 错误,类型不兼容,若要赋值需进行强制类型转换 // Dog dog = new Animal();当将一个引用类型赋值给另一个引用类型,是将一个引用指向另一个引用指向的对象,此时这两个引用会指向同一个对象
class Person { String name; Person(String name) { this.name = name; } public static void main(String[] args) { Person p1 = new Person("Alice"); // p2 和 p1 指向同一个 Person 对象 Person p2 = p1; p2.name = "Bob"; // 输出 "Bob",因为 p1 和 p2 指向同一个对象 System.out.println(p1.name); } }引用类型空值赋值
当想要一个引用不指向任何一个对象时,可以将赋值为null,此时不指向任何一个对象
(2)复合赋值运算符 +=, -=, *=, /=, %=
加后赋值
int num18 = 5; num18 += 3; // 等价于 num18 = num18 + 3,num18 的值为 8减后赋值
int num19 = 5; num19 -= 3; // 等价于 num19 = num19 - 3,num19 的值为 2乘后赋值
int num20 = 5; num20 *= 3; // 等价于 num20 = num20 * 3,num20 的值为 15除后赋值
int num21 = 6; num21 /= 3; // 等价于 num21 = num21 / 3,num21 的值为 2取模后赋值
int num22 = 7; num22 %= 3; // 等价于 num22 = num22 % 3,num22 的值为 13.比较运算符
(1)等于运算符 ==
用于判断两个值是否相等
int num23 = 5; int num24 = 5; boolean isEqual = (num23 == num24); // isEqual 的值为 true注意事项
当比较的时两个引用时 ==此时比较的时两个引用是否指向同一个对象,也就是地址是不是一样的,而不是对象的内容是否相同,此时需要使用使用Java中的方法equals()
String str1 = new String("hello"); String str2 = new String("hello"); boolean isSame = str1 == str2;//比较的是引用 boolean isEqual = str1.equals(str2);//比较的是内容(2)不等于运算符 !=
用于判断两个数的值是否不相等
int num25 = 5; int num26 = 3; boolean isNotEqual = (num25 != num26); // isNotEqual 的值为 true(3)大于,大于等于运算符 >, >=
int num27 = 5; int num28 = 3; boolean isGreater = (num27 > num28); // isGreater 的值为 true int num31 = 5; int num32 = 5; boolean isGreaterOrEqual = (num31 >= num32); // isGreaterOrEqual 的值为 true(4)小于,小于等于运算符 <, <=
和大于等于同理
对字符进行比较时
可以对字符类型进行比较,因为字符在计算机中是以 ASCII 码值的形式存储的,比较时实际是比较它们的 ASCII 码值
4.逻辑运算符
(1)逻辑与 &&
逻辑与,即当两边都为真时才为真,也就是当两个条件都满足时才是true,如果第一个表达式为false,那么就不会执行第二个表达式了
boolean condition1 = true; boolean condition2 = false; boolean result5 = condition1 && condition2; // result5 的值为 false注意事项
&&与||都具有短路特性,&&如果左边的表达式为false,那么就不会再执行右边的表达式
int a = 5; boolean result = (a > 10) && (++a > 20); // a > 10 为 false,++a 不会执行(2)逻辑或 ||
只要两个布尔表达式中有一个为true,结果就为true。如果第一个表达式为true,则不会计算第二个表达式
boolean condition3 = true; boolean condition4 = false; boolean result6 = condition3 || condition4; // result6 的值为 true也可以用于短路逻辑,只要第一个为true,那么就不会执行第二个,可以用来防止空指针时使用
(3)逻辑非 !
用于对布尔值取反
boolean condition5 = true; boolean result7 = !condition5; // result7 的值为 false5.位运算符
在 Java 里,位运算符用于直接操作整数类型(像byte、short、int、long)的二进制位 ,主要时用于操作二进制位
(1)按位与 &
按位与运算符会对两个操作数的对应二进制位进行与运算。仅当两个对应位都为 1 时,结果位才为 1;否则结果位为 0
int a = 5; // 二进制 0101 int b = 3; // 二进制 0011 int result = a & b; // 二进制 0001,结果为 1 System.out.println(result);(2)按位或 |
按位或运算符会对两个操作数的对应二进制位进行或运算。只要两个对应位中有一个为 1,结果位就为 1;只有当两个对应位都为 0 时,结果位才为 0
int c = 5; // 二进制 0101 int d = 3; // 二进制 0011 int result1 = c | d; // 二进制 0111,结果为 7 System.out.println(result1);(3)按位异或 ^
按位异或运算符会对两个操作数的对应二进制位进行异或运算。当两个对应位不同时,结果位为 1;当两个对应位相同时,结果位为 0
int e = 5; // 二进制 0101 int f = 3; // 二进制 0011 int result2 = e ^ f; // 二进制 0110,结果为 6 System.out.println(result2);(4)按位取反 ~
按位取反运算符是单目运算符,它会对操作数的每个二进制位取反,即 0 变为 1,1 变为 0
int g = 5; // 二进制 0101 int result3 = ~g; // 二进制 1010,结果为 -6 System.out.println(result3);(5)左移运算符 <<
左移运算符会把操作数的二进制位向左移动指定的位数,右边空出的位用 0 填充
int h = 5; // 二进制 0101 int result4 = h << 2; // 二进制 010100,结果为 20 System.out.println(result4);(6)右移运算符 >>
右移运算符会把操作数的二进制位向右移动指定的位数,左边空出的位用符号位填充(正数用 0 填充,负数用 1 填充)
int j = -5; // 二进制补码表示 int result6 = j >> 1; // 负数右移,左边补 1 System.out.println(result6);(7)无符号右移运算符
无符号右移运算符会把操作数的二进制位向右移动指定的位数,左边空出的位用 0 填充,无论操作数是正数还是负数
int k = -5; // 二进制补码表示 int result7 = k >>> 1; // 无符号右移,左边补 0 System.out.println(result7);