跳转至

Java 运算符(操作符)

前言

在上一节中,我们介绍了 Java 的变量和数据类型。本节将学习如何对它们进行运算,这就涉及到 运算符(Operator)

运算符就是 Java 中用于对变量或者字面量进行操作的符号。

本文主要内容包括:

  • 算术运算符
  • 关系运算符
  • 位运算符
  • 逻辑运算符
  • 赋值运算符
  • 条件运算符(三元运算符)
  • instanceof
  • 运算符优先级
  • equals()== 的区别

算术运算符

操作符 描述
+ 加法:相加运算符两侧的值
- 减法:左操作数减去右操作数
* 乘法:相乘操作符两侧的值
/ 除法:左操作数除以右操作数
% 取余:左操作数除以右操作数的余数
++ 自增:操作数的值加 1
-- 自减:操作数的值减 1

⚠️ 注意:++-- 可以放在操作数前后:

  • 前置:先自增/减,再赋值
  • 后置:先赋值,再自增/减

示例

public class Main {
    public static void main(String[] args) {
        int num1 = 10, num2 = 20, num3 = 30, num4 = 40;

        System.out.println("num1 + num2 = " + (num1 + num2));
        System.out.println("num1 - num2 = " + (num1 - num2));
        System.out.println("num1 * num2 = " + (num1 * num2));
        System.out.println("num2 / num1 = " + (num2 / num1));
        System.out.println("num2 % num1 = " + (num2 % num1));
        System.out.println("num3 % num1 = " + (num3 % num1));
        System.out.println("num1++ = " + (num1++));//num1++ = 10
        System.out.println("num1-- = " + (num2--));//num2-- = 20
        System.out.println("num4++ = " + (num4++));//++num3 = 31
        System.out.println("++num4 = " + (++num4));//--num4 = 39
    }
}

这里不难看出,无论是 ++ 还是 --,当它们单独写一行时,不管是放在变量前边还是后边,其最终结果都是一样的。但如果将它们参与运算,此时的效果就不一样了,这里需要注意。

int a = 10;
int b = a++;

以上代码中,先进行了 b = a 的赋值操作,所以此时 b 的值是 10。

int a = 10;
int b = ++a;

而此时,先要对 a 进行加一的操作之后,再将 a 的值赋予 b,所以此时 b 的值为 11。


关系运算符

关系运算符主要是指两个数据间的关系,两者之间的比较结果用逻辑值来表示,常用来比较判断两个变量或常量的大小。

常见的关系运算符及含义如下表:

运算符 描述
== 判断是否相等
!= 判断是否不相等
> 左操作数是否大于右操作数
< 左操作数是否小于右操作数
>= 左操作数是否大于或等于右操作数
<= 左操作数是否小于或等于右操作数

示例2

public class Main {
    public static void main(String[] args) {
        int num1 = 100, num2 = 220;

        System.out.println("num1 == num2 = " + (num1 == num2));//false
        System.out.println("num1 != num2 = " + (num1 != num2));//true
        System.out.println("num1 > num2 = " + (num1 > num2));//false
        System.out.println("num2 < num1 = " + (num2 < num1));//false
        System.out.println("num2 <= num1 = " + (num2 <= num1));//false
        System.out.println("num2 >= num1 = " + (num2 >= num1));//true
    }
}

位运算符

操作符 描述
& 按位与:都为 1 结果为 1,否则为 0
| 按位或:都为 0 结果为 0,否则为 1
^ 按位异或:相同为 0,不同为 1
~ 按位取反:0 变 1,1 变 0
<< 左移:按位左移
>> 右移:按位右移
>>> 无符号右移:高位补 0

示例3

public class Main {
    public static void main(String[] args) {
        int num1 = 10, num2 = 20;

        System.out.println("num1 & num2 = " + (num1 & num2));
        System.out.println("num1 | num2 = " + (num1 | num2));
        System.out.println("num1 ^ num2 = " + (num1 ^ num2));
        System.out.println("~ num2 = " + (~num2));
        System.out.println("num1 << 2 = " + (num1 << 2));
        System.out.println("num1 >> 2 = " + (num1 >> 2));
        System.out.println("num1 >>> 2 = " + (num1 >>> 2));
    }
}

逻辑运算符

操作符 描述
&& 逻辑与:都为 true 时为 true
|| 逻辑或:有一个为 true 时为 true
! 逻辑非:取反

示例4

public class Main {
    public static void main(String[] args) {
        boolean positive = true, negative = false;

        System.out.println("positive && negative = " + (positive && negative));//false
        System.out.println("positive || negative = " + (positive || negative));//true
        System.out.println("!(positive || negative) = " + !(positive || negative));//false
    }
}

赋值运算符

操作符 描述
= 赋值
+= 加后赋值
-= 减后赋值
*= 乘后赋值
/= 除后赋值
%= 取模后赋值
<<= 左移后赋值
>>= 右移后赋值
&= 按位与后赋值
^= 按位异或后赋值
|= 按位或后赋值

示例5

public class Main {
    public static void main(String[] args) {
        int num1 = 100, num2 = 1000;

        System.out.println("num1 += num2 = " + (num1 += num2));
        System.out.println("num1 -= num2 = " + (num1 -= num2));
        System.out.println("num1 *= num2 = " + (num1 *= num2));
        System.out.println("num1 &= num2 = " + (num1 /= num2));
        System.out.println("num1 &= num2 = " + (num1 %= num2));
    }
}

条件运算符(三元运算符)

也叫作三元运算符,共有 3 个操作数,且需要判断布尔表达式的值,常用来取代某个 if-else 语句。

其语法结构如下所示:

关系表达式 ? 表达式 1 : 表达式 2;

示例6

public class Main {
    public static void main(String[] args) {
        int num1 = 30, num2 = 300;

        int result = num1 > num2 ? num1 : num2;
        System.out.println("The max is " + result);
    }
}

instanceof 运算符

用于判断对象是否为某个类或接口的实例。结果为true或者false。

语法:

object instanceof ClassName 

运算符优先级(由高到低)

优先级 运算符
1 .、()、{}
2 !、~、++、--
3 *、/、%
4 +、-
5 <<、>>、>>>
6 <、<=、>、>=、instanceof
7 ==、!=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 =、+=、-=、*=、/=、%=、&=、^=、|=

💡 建议使用 () 明确运算顺序,避免歧义。


equals() 和 == 的区别

  • ==

    • 基本类型:比较值是否相等
    • 引用类型:比较内存地址是否相同(是否为同一对象)
  • equals()

作用也是判断两个对象是否相等,但是 不能用于基本数据类型变量的比较。存在于 Object() 类中,所以所有类都具有 equals() 方法存在两种使用情况:

- 默认在 `Object` 中与 `==` 相同
- 如果类重写了 `equals()`,则比较对象内容是否相等(如 `String`)

示例7

public class Main {
    public static void main(String[] args) {
        int num1 = 10, num2 = 10, num3 = 20;
        String str1 = "安信株式会社";
        String str2 = new String("安信株式会社");

        System.out.println(num1 == num2); // true
        System.out.println(num2 == num3); // false
        System.out.println(str1 == str2); // false (不同对象)
        System.out.println(str1.equals(str2)); // true (内容相同)
    }
}

总结

本章介绍了 Java 的各种运算符,包括:

  • 算术运算符
  • 关系运算符
  • 位运算符
  • 逻辑运算符
  • 赋值运算符
  • 条件运算符
  • instanceof
  • 运算符优先级
  • equals()== 的区别

这些运算符是 Java 程序设计的基础,必须熟练掌握。