Skip to content

运算符

运算符是用于执行特定运算操作的符号。Java 提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符等。

运算符分类

text
┌─────────────────────────────────────────────────────────────────┐
│                       Java 运算符分类                            │
├─────────────────────────────────────────────────────────────────┤
│  算术运算符:+  -  *  /  %  ++  --                              │
│  关系运算符:==  !=  >  <  >=  <=                               │
│  逻辑运算符:&&  ||  !                                          │
│  位运算符:  &  |  ^  ~  <<  >>  >>>                            │
│  赋值运算符:=  +=  -=  *=  /=  %=  等                          │
│  条件运算符:? :                                                │
│  其他运算符:instanceof  new  []  .  ()                         │
└─────────────────────────────────────────────────────────────────┘

算术运算符

算术运算符用于执行数学运算。

基本算术运算符

java
public class ArithmeticOperator {
    public static void main(String[] args) {
        int a = 10;
        int b = 3;
        
        // 加法运算
        int sum = a + b;
        System.out.println(a + " + " + b + " = " + sum);  // 13
        
        // 减法运算
        int diff = a - b;
        System.out.println(a + " - " + b + " = " + diff);  // 7
        
        // 乘法运算
        int product = a * b;
        System.out.println(a + " * " + b + " = " + product);  // 30
        
        // 除法运算(整数除法,结果取整)
        int quotient = a / b;
        System.out.println(a + " / " + b + " = " + quotient);  // 3
        
        // 取模运算(求余数)
        int remainder = a % b;
        System.out.println(a + " % " + b + " = " + remainder);  // 1
        
        // 浮点数除法
        double divResult = 10.0 / 3;
        System.out.println("10.0 / 3 = " + divResult);  // 3.333...
        
        // 字符串连接(+ 运算符重载)
        String str = "Hello" + " " + "Java";
        System.out.println(str);  // Hello Java
        
        // 数字与字符串连接
        String mixed = "结果是:" + (a + b);
        System.out.println(mixed);  // 结果是:13
    }
}

自增自减运算符

java
public class IncrementOperator {
    public static void main(String[] args) {
        int a = 5;
        
        // 前缀自增:先加1,再使用
        int b = ++a;
        System.out.println("前缀自增: a = " + a + ", b = " + b);  // a=6, b=6
        
        int c = 5;
        // 后缀自增:先使用,再加1
        int d = c++;
        System.out.println("后缀自增: c = " + c + ", d = " + d);  // c=6, d=5
        
        int e = 10;
        // 前缀自减:先减1,再使用
        int f = --e;
        System.out.println("前缀自减: e = " + e + ", f = " + f);  // e=9, f=9
        
        int g = 10;
        // 后缀自减:先使用,再减1
        int h = g--;
        System.out.println("后缀自减: g = " + g + ", h = " + h);  // g=9, h=10
        
        // 复杂表达式中的自增
        int x = 5;
        int result = x++ + ++x;
        // x++ = 5, x 变为 6
        // ++x = 7, x 变为 7
        // result = 5 + 7 = 12
        System.out.println("x = " + x + ", result = " + result);  // x=7, result=12
    }
}

关系运算符

关系运算符用于比较两个值,返回布尔值。

java
public class RelationalOperator {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        
        // 等于
        boolean equal = a == b;
        System.out.println(a + " == " + b + " : " + equal);  // false
        
        // 不等于
        boolean notEqual = a != b;
        System.out.println(a + " != " + b + " : " + notEqual);  // true
        
        // 大于
        boolean greater = a > b;
        System.out.println(a + " > " + b + " : " + greater);  // false
        
        // 小于
        boolean less = a < b;
        System.out.println(a + " < " + b + " : " + less);  // true
        
        // 大于等于
        boolean greaterEqual = a >= 10;
        System.out.println(a + " >= 10 : " + greaterEqual);  // true
        
        // 小于等于
        boolean lessEqual = b <= 20;
        System.out.println(b + " <= 20 : " + lessEqual);  // true
        
        // 字符比较(比较 Unicode 编码)
        char c1 = 'A';
        char c2 = 'B';
        System.out.println("'A' < 'B' : " + (c1 < c2));  // true
        
        // 字符串比较(使用 equals,不要用 ==)
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        System.out.println("s1 == s2 : " + (s1 == s2));          // true(常量池)
        System.out.println("s1 == s3 : " + (s1 == s3));          // false
        System.out.println("s1.equals(s3) : " + s1.equals(s3)); // true
    }
}

逻辑运算符

逻辑运算符用于连接布尔表达式。

java
public class LogicalOperator {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        
        // 逻辑与(&&):两边都为 true 才为 true
        boolean and = a && b;
        System.out.println("true && false = " + and);  // false
        
        // 逻辑或(||):一边为 true 就为 true
        boolean or = a || b;
        System.out.println("true || false = " + or);  // true
        
        // 逻辑非(!):取反
        boolean not = !a;
        System.out.println("!true = " + not);  // false
        
        // 短路特性演示
        int x = 10;
        int y = 0;
        
        // 短路与:如果左边为 false,右边不执行
        if (y != 0 && x / y > 1) {
            System.out.println("不会执行这里");
        } else {
            System.out.println("短路与生效,避免了除零错误");
        }
        
        // 短路或:如果左边为 true,右边不执行
        if (x > 0 || x / y > 1) {
            System.out.println("短路或生效,右边未执行");
        }
        
        // 非短路运算符(& 和 |)
        // 这两个运算符没有短路特性,两边都会执行
        // if (y != 0 & x / y > 1) {  // 会抛出 ArithmeticException
        //     System.out.println("不会执行");
        // }
        
        // 异或(^):两边不同为 true,相同为 false
        boolean xor1 = true ^ false;   // true
        boolean xor2 = true ^ true;    // false
        boolean xor3 = false ^ false;  // false
        System.out.println("true ^ false = " + xor1);
        System.out.println("true ^ true = " + xor2);
        System.out.println("false ^ false = " + xor3);
    }
}

位运算符

位运算符直接对整数的二进制位进行操作。

java
public class BitwiseOperator {
    public static void main(String[] args) {
        int a = 60;   // 二进制:0011 1100
        int b = 13;   // 二进制:0000 1101
        
        // 按位与(&):两位都为1才为1
        int and = a & b;  // 0000 1100 = 12
        System.out.println("60 & 13 = " + and);  // 12
        
        // 按位或(|):有一位为1就为1
        int or = a | b;   // 0011 1101 = 61
        System.out.println("60 | 13 = " + or);   // 61
        
        // 按位异或(^):两位不同为1
        int xor = a ^ b;  // 0011 0001 = 49
        System.out.println("60 ^ 13 = " + xor);  // 49
        
        // 按位取反(~):0变1,1变0
        int not = ~a;     // 1100 0011 = -61
        System.out.println("~60 = " + not);      // -61
        
        // 左移(<<):所有位向左移动,低位补0
        int leftShift = a << 2;  // 1111 0000 = 240
        System.out.println("60 << 2 = " + leftShift);  // 240
        
        // 右移(>>):所有位向右移动,高位补符号位
        int rightShift = a >> 2;  // 0000 1111 = 15
        System.out.println("60 >> 2 = " + rightShift);  // 15
        
        // 无符号右移(>>>):所有位向右移动,高位补0
        int unsignedRight = -1 >>> 2;
        System.out.println("-1 >>> 2 = " + unsignedRight);  // 1073741823
        
        // 位运算技巧
        // 判断奇偶:n & 1 == 1 为奇数
        int num = 7;
        System.out.println(num + " 是奇数:" + ((num & 1) == 1));  // true
        
        // 交换两个数(不使用临时变量)
        int x = 5, y = 10;
        x = x ^ y;
        y = x ^ y;
        x = x ^ y;
        System.out.println("交换后:x = " + x + ", y = " + y);  // x=10, y=5
        
        // 快速乘除2的幂
        int n = 8;
        System.out.println(n + " * 2 = " + (n << 1));   // 16
        System.out.println(n + " / 2 = " + (n >> 1));   // 4
    }
}

赋值运算符

赋值运算符用于给变量赋值。

java
public class AssignmentOperator {
    public static void main(String[] args) {
        // 基本赋值
        int a = 10;
        System.out.println("a = " + a);  // 10
        
        // 复合赋值运算符
        int b = 20;
        
        // 加法赋值
        b += 5;   // 等价于 b = b + 5
        System.out.println("b += 5: " + b);  // 25
        
        // 减法赋值
        b -= 10;  // 等价于 b = b - 10
        System.out.println("b -= 10: " + b);  // 15
        
        // 乘法赋值
        b *= 2;   // 等价于 b = b * 2
        System.out.println("b *= 2: " + b);  // 30
        
        // 除法赋值
        b /= 3;   // 等价于 b = b / 3
        System.out.println("b /= 3: " + b);  // 10
        
        // 取模赋值
        b %= 3;   // 等价于 b = b % 3
        System.out.println("b %= 3: " + b);  // 1
        
        // 位运算赋值
        int c = 60;
        c &= 13;   // 等价于 c = c & 13
        System.out.println("c &= 13: " + c);  // 12
        
        c |= 1;    // 等价于 c = c | 1
        System.out.println("c |= 1: " + c);   // 13
        
        c ^= 5;    // 等价于 c = c ^ 5
        System.out.println("c ^= 5: " + c);   // 8
        
        c <<= 2;   // 等价于 c = c << 2
        System.out.println("c <<= 2: " + c);  // 32
        
        c >>= 1;   // 等价于 c = c >> 1
        System.out.println("c >>= 1: " + c);  // 16
        
        // 连续赋值
        int d, e, f;
        d = e = f = 100;
        System.out.println("d = " + d + ", e = " + e + ", f = " + f);
    }
}

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

条件运算符是 Java 中唯一的三元运算符。

java
public class ConditionalOperator {
    public static void main(String[] args) {
        // 语法:条件 ? 表达式1 : 表达式2
        // 条件为 true 返回表达式1,否则返回表达式2
        
        int a = 10;
        int b = 20;
        
        // 求较大值
        int max = a > b ? a : b;
        System.out.println("较大值: " + max);  // 20
        
        // 求较小值
        int min = a < b ? a : b;
        System.out.println("较小值: " + min);  // 10
        
        // 判断奇偶
        int num = 7;
        String evenOrOdd = num % 2 == 0 ? "偶数" : "奇数";
        System.out.println(num + " 是 " + evenOrOdd);  // 7 是 奇数
        
        // 判断正负零
        int value = -5;
        String sign = value > 0 ? "正数" : (value < 0 ? "负数" : "零");
        System.out.println(value + " 是 " + sign);  // -5 是 负数
        
        // 嵌套使用(不推荐过多嵌套,影响可读性)
        int score = 85;
        String grade = score >= 90 ? "优秀" :
                       score >= 80 ? "良好" :
                       score >= 60 ? "及格" : "不及格";
        System.out.println("成绩 " + score + " 等级: " + grade);  // 良好
        
        // 实际应用:空值处理
        String name = null;
        String displayName = name != null ? name : "匿名用户";
        System.out.println("显示名称: " + displayName);  // 匿名用户
    }
}

运算符优先级

当表达式中包含多种运算符时,按照优先级顺序执行。

text
优先级从高到低:
┌─────────────────────────────────────────────────────────────────┐
│  优先级 │        运算符         │           说明                 │
├─────────────────────────────────────────────────────────────────┤
│    1    │  ()  []  .            │ 括号、数组访问、成员访问       │
│    2    │  !  ~  ++  --  +  -   │ 一元运算符                     │
│    3    │  *  /  %              │ 乘法、除法、取模               │
│    4    │  +  -                 │ 加法、减法                     │
│    5    │  <<  >>  >>>          │ 移位运算                       │
│    6    │  <  <=  >  >=         │ 比较运算                       │
│    7    │  ==  !=               │ 相等比较                       │
│    8    │  &                    │ 按位与                         │
│    9    │  ^                    │ 按位异或                       │
│   10    │  |                    │ 按位或                         │
│   11    │  &&                   │ 逻辑与                         │
│   12    │  ||                   │ 逻辑或                         │
│   13    │  ? :                  │ 条件运算符                     │
│   14    │  = += -= *= /= %= 等  │ 赋值运算符                     │
└─────────────────────────────────────────────────────────────────┘
java
public class OperatorPrecedence {
    public static void main(String[] args) {
        // 使用括号明确优先级,提高可读性
        
        // 算术运算优先级
        int result1 = 2 + 3 * 4;       // 14(先乘后加)
        int result2 = (2 + 3) * 4;     // 20(括号改变优先级)
        System.out.println("2 + 3 * 4 = " + result1);
        System.out.println("(2 + 3) * 4 = " + result2);
        
        // 逻辑运算优先级
        boolean b1 = true || false && false;   // true(&& 优先级高于 ||)
        boolean b2 = (true || false) && false; // false
        System.out.println("true || false && false = " + b1);
        System.out.println("(true || false) && false = " + b2);
        
        // 混合运算
        int a = 5, b = 3, c = 2;
        boolean result = a > b && b > c || a < c;
        // 等价于:(a > b && b > c) || a < c
        // 即:(true && true) || false = true
        System.out.println("a > b && b > c || a < c = " + result);
        
        // 赋值与比较
        int x = 10;
        boolean isEqual = (x = 20) == 20;  // 先赋值,再比较
        System.out.println("x = " + x + ", isEqual = " + isEqual);
        
        // 复杂表达式建议使用括号
        int complex = ((a + b) * c - 10) / 2;
        System.out.println("((a + b) * c - 10) / 2 = " + complex);
    }
}

其他运算符

instanceof 运算符

java
public class InstanceofOperator {
    public static void main(String[] args) {
        // instanceof:判断对象是否为某个类的实例
        String str = "Hello";
        
        // 判断 str 是否是 String 的实例
        boolean isString = str instanceof String;
        System.out.println("str 是 String 的实例: " + isString);  // true
        
        // 判断 str 是否是 Object 的实例(String 继承自 Object)
        boolean isObject = str instanceof Object;
        System.out.println("str 是 Object 的实例: " + isObject);  // true
        
        // 判断 null
        String nullStr = null;
        boolean isNullInstance = nullStr instanceof String;
        System.out.println("null 是 String 的实例: " + isNullInstance);  // false
        
        // 用于类型检查
        Object obj = "Hello Java";
        if (obj instanceof String) {
            String s = (String) obj;  // 安全转型
            System.out.println("字符串长度: " + s.length());
        }
        
        // Java 16+ 模式匹配
        // if (obj instanceof String s) {
        //     System.out.println("字符串长度: " + s.length());
        // }
    }
}

new 运算符

java
public class NewOperator {
    public static void main(String[] args) {
        // new:创建对象
        String str = new String("Hello");
        int[] arr = new int[5];
        
        // 创建自定义类对象
        Person person = new Person();
        person.name = "张三";
        person.age = 25;
        person.introduce();
    }
}

class Person {
    String name;
    int age;
    
    void introduce() {
        System.out.println("我是 " + name + ",今年 " + age + " 岁");
    }
}

小结

本章我们学习了:

  • 算术运算符:+、-、*、/、%、++、--
  • 关系运算符:==、!=、>、<、>=、<=
  • 逻辑运算符:&&、||、!
  • 位运算符:&、|、^、~、<<、>>、>>>
  • 赋值运算符:=、+=、-=、*=、/= 等
  • 条件运算符:? :
  • 运算符优先级:使用括号明确优先级

下一章,我们将学习 流程控制,了解 Java 中的条件语句和循环语句。