【Java】运算符全解:从基础到实战,一文吃透所有用法

大家好呀~ 作为 Java 入门的核心知识点,运算符是编写代码的基础工具。今天就带大家全面拆解 Java 中的各类运算符,结合实际代码示例,帮大家理清用法、避开坑点,新手也能轻松掌握!

一、算术运算符:最常用的数值计算工具

算术运算符主要用于数值运算,包括基本的加减乘除和自增自减,咱们逐个看用法:

public class ArithmeticDemo {
    public static void main(String[] args) {
        // 基本算术运算
        int a = 10, b = 3;
        System.out.println("加法:" + (a + b)); // 输出 13
        System.out.println("减法:" + (a - b)); // 输出 7
        System.out.println("乘法:" + (a * b)); // 输出 30
        System.out.println("除法(整型):" + (a / b)); // 输出 3(整型运算无小数)
        System.out.println("除法(浮点型):" + (a / (double) b)); // 输出 3.333...(含小数)
        System.out.println("取余:" + (a % b)); // 输出 1(余数)

        // 除零情况对比
        double c = 10.0;
        // System.out.println(a / 0); // 整数除零,抛出 ArithmeticException: / by zero
        System.out.println(c / 0); // 浮点数除零,输出 Infinity
        System.out.println(0.0 / 0); // 特殊情况,输出 NaN

        // 自增自减运算符
        int d = 5;
        System.out.println(d++); // 先使用后自增,输出 5,执行后 d=6
        System.out.println(++d); // 先自增后使用,输出 7,执行后 d=7
        System.out.println(d--); // 先使用后自减,输出 7,执行后 d=6
        System.out.println(--d); // 先自减后使用,输出 5,执行后 d=5
    }
}

关键注意点

  • 整型之间运算结果仍是整型,如需保留小数需先转浮点型
  • 整数除零直接抛异常,浮点数除零返回特殊值(Infinity/Nan)
  • 自增自减的前缀(++d)和后缀(d++)影响执行顺序,实际开发中尽量单独一行使用避免混淆

二、关系运算符:判断条件的核心

关系运算符用于比较两个值的关系,返回布尔值(true/false),常用于条件判断:

public class RelationDemo {
    public static void main(String[] args) {
        int x = 8, y = 8;
        System.out.println("等于(==):" + (x == y)); // 输出 true
        System.out.println("不等于(!=):" + (x != y)); // 输出 false
        System.out.println("大于(>):" + (x > y)); // 输出 false
        System.out.println("小于(<):" + (x < y)); // 输出 false
        System.out.println("大于等于(>=):" + (x >= y)); // 输出 true
        System.out.println("小于等于(<=):" + (x <= y)); // 输出 true

        // 注意:引用类型比较地址,基本类型比较值
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1 == s2); // 输出 false(地址不同)
        System.out.println(s1.equals(s2)); // 输出 true(值相同)
    }
}

关键注意点

  • 基本类型用==比较值,引用类型(如 String)用==比较内存地址,比较值需用equals()方法
  • 关系运算符的结果只能是 true 或 false,不能直接赋值给非布尔变量

三、位运算符:直接操作二进制的高效工具

位运算符直接对整数的二进制位进行操作,效率极高,常用于底层开发或性能优化:

public class BitwiseDemo {
    public static void main(String[] args) {
        int m = 10; // 二进制:1010
        int n = 6;  // 二进制:0110

        // 按位与(&):对应位都为1才为1
        System.out.println("按位与:" + (m & n)); // 二进制 0010 → 输出 2
        // 按位或(|):对应位有一个为1就为1
        System.out.println("按位或:" + (m | n)); // 二进制 1110 → 输出 14
        // 按位异或(^):对应位不同才为1
        System.out.println("按位异或:" + (m ^ n)); // 二进制 1100 → 输出 12
        // 按位非(~):按位取反(符号位也取反)
        System.out.println("按位非:" + (~m)); // 结果为 -11(补码机制)

        // 移位运算
        System.out.println("左移2位(10<<2):" + (10 << 2)); // 10*2²=40
        System.out.println("左移3位(10<<3):" + (10 << 3)); // 10*2³=80
        System.out.println("右移2位(10>>2):" + (10 >> 2)); // 10/2²=2
        System.out.println("右移2位(20>>2):" + (20 >> 2)); // 20/2²=5
        System.out.println("无符号右移(-10>>>2):" + (-10 >>> 2)); // 忽略符号位右移
    }
}

关键注意点

  • 移位运算本质是乘 / 除 2 的 n 次方,比直接用* /效率更高
  • 左移可能导致溢出,无符号右移(>>>)会把符号位当普通位处理(仅对整数有效)
  • 按位非(~)运算结果遵循补码规则,正数取反后为负数

四、逻辑运算符:组合条件判断

逻辑运算符用于连接多个条件,返回布尔值,核心是短路特性:

public class LogicalDemo {
    public static void main(String[] args) {
        int num = 5;

        // 逻辑与(&&):短路特性,第一个条件为false则不执行第二个
        boolean condition1 = (num > 10) && (++num > 5);
        System.out.println("逻辑与结果:" + condition1); // 输出 false
        System.out.println("num值:" + num); // 输出 5(第二个条件未执行)

        // 单与(&):无短路特性,无论第一个条件如何都执行第二个
        boolean condition2 = (num > 10) & (++num > 5);
        System.out.println("单与结果:" + condition2); // 输出 false
        System.out.println("num值:" + num); // 输出 6(第二个条件已执行)

        // 逻辑或(||):短路特性,第一个条件为true则不执行第二个
        boolean condition3 = (num > 5) || (++num > 10);
        System.out.println("逻辑或结果:" + condition3); // 输出 true
        System.out.println("num值:" + num); // 输出 6(第二个条件未执行)

        // 单或(|):无短路特性,无论第一个条件如何都执行第二个
        boolean condition4 = (num > 5) | (++num > 10);
        System.out.println("单或结果:" + condition4); // 输出 true
        System.out.println("num值:" + num); // 输出 7(第二个条件已执行)

        // 逻辑非(!):取反
        boolean flag = true;
        System.out.println("逻辑非结果:" + !flag); // 输出 false
    }
}

关键注意点

  • 开发中优先使用短路运算符(&&、||),既能提高效率又能避免不必要的副作用
  • 单与(&)、单或(|)仅在需要强制执行所有条件时使用(如同时判断多个表达式并执行副作用)

五、赋值运算符:变量赋值与简化写法

赋值运算符用于给变量赋值,支持直接赋值和复合赋值,注意类型转换问题:

public class AssignmentDemo {
    public static void main(String[] args) {
        // 基本赋值
        int a = 10;
        System.out.println("基本赋值:" + a); // 输出 10

        // 复合赋值(等价于 a = a + 5,但更简洁)
        a += 5;
        System.out.println("加法赋值:" + a); // 输出 15
        a -= 3;
        System.out.println("减法赋值:" + a); // 输出 12
        a *= 2;
        System.out.println("乘法赋值:" + a); // 输出 24
        a /= 4;
        System.out.println("除法赋值:" + a); // 输出 6

        // 类型转换注意点
        short b = 10;
        short c = 20;
        // b = b + c; // 编译错误:b+c默认转为int,无法直接赋值给short
        b += c; // 复合赋值会自动隐式转换,无编译错误
        System.out.println("short类型复合赋值:" + b); // 输出 30

        // 溢出问题
        int maxInt = Integer.MAX_VALUE;
        int overflow = maxInt + 1;
        System.out.println("int溢出结果:" + overflow); // 输出 -2147483648(循环溢出)
    }
}

关键注意点

  • 复合赋值(+=、-= 等)会自动进行隐式类型转换,避免编译错误
  • 两个大整数运算可能导致溢出,需提前判断或使用更大类型(如 long)

六、三元运算符:简洁的条件判断

三元运算符是 if-else 的简化写法,语法:条件 ? 表达式1 : 表达式2,条件为 true 执行表达式 1,否则执行表达式 2:

public class TernaryDemo {
    public static void main(String[] args) {
        int score = 85;
        // 判断成绩等级
        String grade = score >= 90 ? "优秀" : (score >= 80 ? "良好" : "及格");
        System.out.println("成绩等级:" + grade); // 输出 良好

        // 求两个数的最大值
        int num1 = 23, num2 = 45;
        int maxNum = num1 > num2 ? num1 : num2;
        System.out.println("最大值:" + maxNum); // 输出 45

        // 注意:表达式1和表达式2类型需一致或可兼容
        // String result = num1 > num2 ? num1 : "num2更大"; // 编译错误:类型不兼容
    }
}

关键注意点

  • 三元运算符可以嵌套,但嵌套层数不宜过多(建议不超过 2 层),否则影响可读性
  • 表达式 1 和表达式 2 的返回类型必须一致或可自动转换,否则编译报错
  • 简单条件用三元运算符更简洁,复杂逻辑建议用 if-else

总结

Java 运算符看似基础,但用好、用对能让代码更简洁高效。核心要点总结:

  1. 算术运算注意整型 / 浮点型区别和除零问题
  2. 关系运算区分基本类型和引用类型的比较方式
  3. 位运算适合底层开发,移位运算效率高
  4. 逻辑运算优先用短路运算符,避免副作用
  5. 赋值运算注意类型转换和溢出
  6. 三元运算符简化简单条件判断,兼顾可读性

如果大家在实际使用中遇到运算符相关的坑,或者有其他疑问,欢迎在评论区留言交流~ 后续还会分享更多 Java 核心知识点,记得关注哦!

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*