Java

Java 知识量:11 - 45 - 220

2.3 表达式和运算符><

运算符概述- 2.3.1 -

Java运算符是对常量和变量进行操作的符号,可以用于算术运算、比较运算和逻辑运算等。

  • 算术运算符:包括加(+)、减(-)、乘(*)、除(/)、取余(%)、递增(++)、递减(--)等操作。其中,除法运算符“/”在整数相除时得到整数结果,若想得到小数结果,需要将操作数变为浮点数类型。取余运算符“%”用于获取除法操作的余数。

  • 比较运算符:用于比较两个变量的值,结果为真或假。例如,等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

  • 逻辑运算符:用于进行逻辑运算,如与(&&)、或(||)、非(!)等。

  • 位运算符:用于对二进制位进行操作,如按位与(&)、按位或(|)、按位非(~)等。

  • 三目运算符:也称为条件运算符,用于根据条件判断返回不同的值,格式为:条件表达式 ? 值1 : 值2。

  • 赋值运算符:如等于(=)、加等于(+=)、减等于(-=)、乘等于(*=)、除等于(/=)等,用于将右侧操作数的值赋给左侧操作数。注意:赋值运算符是从右往左看的。

在实际编程中,需要根据具体的运算需求选择正确的运算符,并且要注意运算符的优先级和结合性,以确保计算结果的正确性。

运算符优先级和结合性- 2.3.2 -

Java 运算符的优先级和结合性与大多数其他编程语言类似。以下是一些主要的运算符和它们的优先级及结合性,从高到低:

  1. 单目运算符(++, --, +, -, ~, !):从右向左。

  2. 强制类型转换运算符((type)):从右向左。

  3. 乘法 / 除法 / 取余(*, /, %):从左向右。

  4. 加法 / 减法(+, -):从左向右。

  5. 移位运算符(<<, >>, >>>):从左向右。

  6. 关系运算符(<, <=, >, >=, instanceof):从左向右。

  7. 等于不等于运算符(==, !=):从左向右。

  8. 位与运算符(&):从左向右。

  9. 位异或运算符(^):从左向右。

  10. 位或运算符(|):从左向右。

  11. 逻辑与运算符(&&):从左向右。

  12. 逻辑或运算符(||):从左向右。

  13. 三元运算符(? :):从右向左。

  14. 赋值运算符(=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=):从右向左。

注意:这只是通常情况下的优先级。在某些情况下,例如使用括号或执行特定的操作,这些规则可能会有所不同。在编写代码时,为了避免可能的混淆,最好明确地使用括号来指示你的意图。

算术运算符- 2.3.3 -

Java 中的算术运算符用于执行基本的数学运算。以下是一些常见的 Java 算术运算符:

  • 加法运算符:+

  • 减法运算符:-

  • 乘法运算符:*

  • 除法运算符:/

  • 取余运算符:%

  • 递增运算符:++

  • 递减运算符:--

这些运算符的使用示例如下:

int a = 10;  
int b = 5;  
  
int sum = a + b; // 加法  
int diff = a - b; // 减法  
int product = a * b; // 乘法  
int quotient = a / b; // 除法  
int remainder = a % b; // 取余  
  
a++; // 递增  
b--; // 递减

注意:除法和取余运算符在处理整数时会舍去小数部分,而在处理浮点数时会保留小数部分。如果要执行精确的浮点数计算,可以使用 double 类型。

此外,Java 还支持一些复合赋值运算符,如 +=、-=、*=、/=、%= 等,用于简化常见的算术操作。例如:

a += b; // 等同于 a = a + b;  
b -= a; // 等同于 b = b - a;  
product *= 2; // 等同于 product = product * 2;  
quotient /= 2; // 等同于 quotient = quotient / 2;  
remainder %= 2; // 等同于 remainder = remainder % 2;

字符串连接运算符- 2.3.4 -

在Java中,字符串连接可以通过几种不同的方式实现。

1、使用 + 运算符:

String str1 = "Hello";  
String str2 = "World";  
String str3 = str1 + " " + str2;  
System.out.println(str3); // 输出 "Hello World"

2、使用 concat() 方法:

String str1 = "Hello";  
String str2 = "World";  
String str3 = str1.concat(" ").concat(str2);  
System.out.println(str3); // 输出 "Hello World"

3、使用 StringBuilder 或 StringBuffer:

StringBuilder sb = new StringBuilder();  
sb.append("Hello");  
sb.append(" ");  
sb.append("World");  
String str = sb.toString();  
System.out.println(str); // 输出 "Hello World"

注意:虽然使用 + 运算符和 concat() 方法可以简化代码,但在性能上并不理想。因为每次连接操作都会创建一个新的字符串对象。当需要连接大量的字符串时,推荐使用 StringBuilder 或 StringBuffer,因为它们可以在一个单一的字符串对象上进行操作,从而提高性能。

比较运算符- 2.3.5 -

Java中的比较运算符用于比较两个值的大小或相等性。以下是Java中的比较运算符:

  • 等于运算符(==):比较两个值是否相等。

  • 不等于运算符(!=):比较两个值是否不相等。

  • 大于运算符(>):比较左边的值是否大于右边的值。

  • 小于运算符(<):比较左边的值是否小于右边的值。

  • 大于等于运算符(>=):比较左边的值是否大于或等于右边的值。

  • 小于等于运算符(<=):比较左边的值是否小于或等于右边的值。

这些运算符可以用于比较基本数据类型(如int、double、char等)和对象类型(如String、Date等)。但是,对于对象类型的比较,必须使用equals()方法进行相等性比较,而不是使用==运算符。

逻辑运算符- 2.3.6 -

Java中的逻辑运算符用于将布尔表达式组合起来,形成更复杂的逻辑表达式。以下是Java中的逻辑运算符:

  • 逻辑与运算符(&&):如果两边的表达式都为true,则结果为true。

  • 逻辑或运算符(||):如果两边的表达式中至少有一个为true,则结果为true。

  • 逻辑非运算符(!):将表达式的结果取反。

这些运算符可以用于构建复杂的条件语句,控制程序的执行流程。同时,还可以与关系运算符(如比较运算符)结合使用,实现更丰富的逻辑判断。

位运算符和位移运算符- 2.3.7 -

Java中的位运算符和位移运算符用于操作二进制位。以下是Java支持的位运算符和位移运算符:

  • 位与运算符(&):将两个二进制数的每一位进行与操作,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。

  • 位或运算符(|):将两个二进制数的每一位进行或操作,如果两个相应的二进制位都为0,则该位的结果值为0,否则为1。

  • 位异或运算符(^):将两个二进制数的每一位进行异或操作,如果两个相应的二进制位不同,则该位的结果值为1,否则为0。

  • 位非运算符(~):将一个二进制数的每一位进行非操作,即取反操作,将1变为0,将0变为1。

  • 左移运算符(<<):将一个二进制数向左移动指定的位数,并在低位补零。

  • 右移运算符(>>):将一个二进制数向右移动指定的位数,移动后高位补零或补符号位(即正数补零,负数补符号位)。

  • 无符号右移运算符(>>>):将一个二进制数向右移动指定的位数,移动后高位补零。

这些运算符可以直接用于整数类型(byte、short、int、long)的数值上。例如:

int a = 0b10101010; // 二进制表示  
int b = 0b01010101; // 二进制表示  
  
int c = a & b; // 位与运算,结果为 0b00000000  
int d = a | b; // 位或运算,结果为 0b11111111  
int e = a ^ b; // 位异或运算,结果为 0b11111111  
int f = ~a; // 位非运算,结果为 0b01010101  
int g = a << 2; // 左移2位,结果为 0b1010101000  
int h = a >> 2; // 右移2位,结果为 0b00101010  
int i = a >>> 2; // 无符号右移2位,结果为 0b00101010

注意:位运算和位移运算只适用于整数类型,不能用于浮点数类型(float、double)。

赋值运算符- 2.3.8 -

Java中的赋值运算符用于将右侧的值赋给左侧的变量。以下是一些Java赋值运算符:

  • =:将右侧的值赋给左侧的变量。

  • +=:将右侧的值加到左侧的变量上,然后将结果赋给左侧的变量。

  • -=:从左侧的变量中减去右侧的值,然后将结果赋给左侧的变量。

  • *=:将左侧的变量乘以右侧的值,然后将结果赋给左侧的变量。

  • /=:将左侧的变量除以右侧的值,然后将结果赋给左侧的变量。

  • %=:将左侧的变量对右侧的值取模,然后将结果赋给左侧的变量。

  • &=:将左侧的变量与右侧的值进行按位与运算,然后将结果赋给左侧的变量。

  • |=:将左侧的变量与右侧的值进行按位或运算,然后将结果赋给左侧的变量。

  • ^=:将左侧的变量与右侧的值进行按位异或运算,然后将结果赋给左侧的变量。

  • >>=:将左侧的变量向右移动指定的位数,然后将结果赋给左侧的变量。

  • <<=:将左侧的变量向左移动指定的位数,然后将结果赋给左侧的变量。

例如,以下是一些使用赋值运算符的示例:

int a = 10; // 将10赋给变量a  
a += 5; // 将5加到变量a上,然后将结果赋给a  
a -= 2; // 从变量a中减去2,然后将结果赋给a  
a *= 3; // 将变量a乘以3,然后将结果赋给a  
a /= 2; // 将变量a除以2,然后将结果赋给a  
a %= 4; // 将变量a对4取模,然后将结果赋给a  
int b = 0b1010; // 将二进制数1010赋给变量b  
b &= 0b1100; // 将变量b与二进制数1100进行按位与运算,然后将结果赋给b  
b |= 0b0011; // 将变量b与二进制数0011进行按位或运算,然后将结果赋给b  
b ^= 0b1111; // 将变量b与二进制数1111进行按位异或运算,然后将结果赋给b  
int c = 0b1000; // 将二进制数1000赋给变量c  
c >>= 2; // 将变量c向右移动2位,然后将结果赋给c  
c <<= 3; // 将变量c向左移动3位,然后将结果赋给c

条件运算符- 2.3.9 -

Java中的条件运算符(也称为三元运算符)用于在一个表达式中实现条件判断。

它的语法如下:

条件表达式 ? 表达式1 : 表达式2;

其中,条件表达式是一个返回布尔值的表达式。如果条件表达式的值为true,则执行表达式1;如果条件表达式的值为false,则执行表达式2。

例如,下面的代码展示了如何使用条件运算符来判断一个数字是否为正数:

int num = -5;  
String result = (num > 0) ? "正数" : "非正数";  
System.out.println(result); // 输出 "非正数"

在上面的代码中,如果变量num的值大于0,则将字符串"正数"赋值给变量result;否则,将字符串"非正数"赋值给变量result。最后,打印变量result的值。

instanceof操作符- 2.3.10 -

Java中的instanceof是一个二元操作符,用于测试一个对象是否是一个类的实例,或者说这个类是否是对象的超类或者接口。

它的语法是:

object instanceof ClassName

其中,object是要测试的对象,ClassName是要测试的类名。

如果object是ClassName的实例,或者是ClassName的子类的实例,或者是实现了ClassName接口的类的实例,那么instanceof操作符返回true。否则,返回false。

例如,假设有一个Animal类和一个Dog类,Dog类是Animal类的子类。可以使用instanceof操作符来测试一个对象是否是Animal类的实例:

Animal animal = new Dog();  
if (animal instanceof Animal) {  
    System.out.println("animal is an instance of Animal");  
}

这段代码会输出"animal is an instance of Animal",因为animal是Dog类的实例,而Dog类是Animal类的子类。

注意:在Java中,每个对象都是Object类的实例,因此,如果使用instanceof操作符测试一个对象是否是Object类的实例,那么结果总是true。