Skip to main content

第三课:运算和逻辑

(一)运算符

Java 提供了一系列运算符来进行数学计算、逻辑判断和位操作等,主要分为以下几类:

运算符类别作用
算术运算符进行基本数学计算(+, -, *, /, %, ++, --
关系运算符比较两个值的关系(==, !=, >, <, >=, <=
位运算符操作二进制位(&, `
逻辑运算符逻辑判断(&&, `
赋值运算符赋值及复合运算(=, +=, -=, *=, /=, %=
条件(三元)运算符根据条件返回不同的值(condition ? true_value : false_value
instanceof 运算符检查对象是否属于某个类
运算符优先级决定运算符执行的先后顺序

1. 算术运算符

用于数学运算,支持整数和浮点数计算。

运算符描述示例(假设 a = 10, b = 20结果
+加法a + b30
-减法a - b-10
*乘法a * b200
/除法b / a2
%取余b % a0
++自增a++++a11
--自减b----b19

示例

public class ArithmeticOperators {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("a + b = " + (a + b));
        System.out.println("a - b = " + (a - b));
        System.out.println("a * b = " + (a * b));
        System.out.println("b / a = " + (b / a));
        System.out.println("b % a = " + (b % a));
    }
}

Java 中没有直接内置 次方运算符

但可以使用 Math.pow() 方法 进行幂运算(次方计算)

double result = Math.pow(2, 3); // 计算 2^3
System.out.println(result); // 输出 8.0

// 如果需要整数,可以使用 int
int intResult = (int) Math.pow(2, 3); // 强制转换为整数
System.out.println(intResult); // 输出 8

2. 关系运算符

用于比较两个值,结果为 truefalse

运算符描述示例(a = 10, b = 20结果
==相等a == bfalse
!=不等a != btrue
>大于a > bfalse
<小于a < btrue
>=大于等于a >= bfalse
<=小于等于a <= btrue

3. 位运算符

操作二进制位,适用于整数类型(int, long, short, byte, char)。

运算符描述示例(a = 60(0011 1100), b = 13(0000 1101))结果
&按位与a & b0000 1100(12)
``按位或`a
^按位异或a ^ b0011 0001(49)
~按位取反~a1100 0011(-61)
<<左移a << 21111 0000(240)
>>右移a >> 20000 1111(15)
>>>无符号右移a >>> 20000 1111(15)

4. 逻辑运算符

用于布尔逻辑判断,返回 truefalse

运算符描述示例(a = true, b = false结果
&&逻辑与a && bfalse
``逻辑或
!逻辑非!afalse

5. 赋值运算符

用于给变量赋值。

运算符示例(c = 10等效于
=c = a + bc = a + b
+=c += ac = c + a
-=c -= ac = c - a
*=c *= ac = c * a
/=c /= ac = c / a
%=c %= ac = c % a
&=c &= ac = c & a
^=c ^= ac = c ^ a
`=``c

6. 条件(三元)运算符

格式:

变量 = (条件) ? 表达式1 : 表达式2;

示例

int age = 18;
String result = (age >= 18) ? "成年人" : "未成年人";
System.out.println(result); // 输出:成年人

7. instanceof 运算符

  • 检查对象是否是某个类的实例
String name = "James";
boolean result = name instanceof String; // true

8. 运算符优先级

当多个运算符出现在一个表达式中,优先级决定了运算顺序。

类别运算符方向
后缀() [] .左到右
一元++ -- + - ~ !右到左
乘性* / %左到右
加性+ -左到右
移位>> >>> <<左到右
关系> >= < <= instanceof左到右
相等== !=左到右
按位`& ^`
逻辑`&&
条件?:右到左
赋值= += -= *= /=右到左

(二) 循环结构

Java 提供了 whiledo...whilefor 这三种主要的循环控制结构,

以及 breakcontinue 关键字用于控制循环流程。

1. while 循环

while 是最基本的循环结构,只要条件为 true,循环体就会一直执行语法格式:

while (条件表达式) {
    // 循环体
}

示例:(输出10-14)

public class WhileLoopExample {
    public static void main(String[] args) {
        int x = 10;
        while (x < 15) {
            System.out.println("当前 x 值: " + x);
            x++; // 递增
        }
    }
}

2. do...while 循环(不常用)

do...whilewhile 类似,do...while 至少会执行一次,因为循环体在条件检查之前执行

语法格式:

do {
    // 代码块
} while (条件表达式);

示例:(输出10-14)

public class DoWhileExample {
    public static void main(String[] args) {
        int x = 10;
        do {
            System.out.println("当前 x 值: " + x);
            x++;
        } while (x < 15);
    }
}

3. for 循环

for 循环 是最常见的循环结构,适用于 已知循环次数 的情况。 语法格式:

for (初始化; 布尔表达式; 更新) {
    // 循环体
}

示例:(输出10-14)

public class ForLoopExample {
    public static void main(String[] args) {
        for (int x = 10; x < 15; x++) {
            System.out.println("当前 x 值: " + x);
        }
    }
}

注意 for 循环里的变量 x 前面不要忘记加上 int

4. 增强型 for 循环

增强型 for(for-each)专门用于遍历数组和集合语法格式:

for (数据类型 变量名 : 数组/集合) {
    // 代码
}

示例(遍历数组):

public class EnhancedForExample {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50};

        for (int num : numbers) {
            System.out.println("数组元素:" + num);
        }
    }
}

运行结果:

数组元素:10
数组元素:20
数组元素:30
数组元素:40
数组元素:50

不能修改数组元素的值(要修改仍需 for)。

5. break 关键字

break 立即跳出整个循环,适用于 提前终止循环 的情况。 示例:

public class BreakExample {
    public static void main(String[] args) {
        for (int x = 1; x <= 5; x++) {
            if (x == 3) {
                System.out.println("x == 3,跳出循环");
                break; // 立即终止循环
            }
            System.out.println("当前 x 值: " + x);
        }
    }
}

运行结果:

当前 x 值: 1
当前 x 值: 2
x == 3,跳出循环

6. continue 关键字

continue 立即跳过当前循环的剩余部分,进入下一次循环示例:

public class ContinueExample {
    public static void main(String[] args) {
        for (int x = 1; x <= 5; x++) {
            if (x == 3) {
                System.out.println("x == 3,跳过");
                continue; // 直接进入下一次循环
            }
            System.out.println("当前 x 值: " + x);
        }
    }
}

运行结果:

当前 x 值: 1
当前 x 值: 2
x == 3,跳过
当前 x 值: 4
当前 x 值: 5

7. 嵌套循环

循环中包含另一个循环称为嵌套循环,常用于 遍历二维数组、打印模式等

示例:打印 5×5 星号

public class NestedLoopExample {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }
    }
}

运行结果:

* * * * *
* * * * *
* * * * *
* * * * *
* * * * *

(三) 条件结构

1. if 语句

语法

if (布尔表达式) {
    // 如果布尔表达式为 true,执行这段代码
}

示例

public class IfExample {
    public static void main(String[] args) {
        int x = 10;

        if (x < 20) {
            System.out.println("x 小于 20");
        }
    }
}

2. if...else 语句

if 语句的条件 不满足(false) 时,执行 else 代码块。

语法

if (布尔表达式) {
    // 如果布尔表达式为 true,执行
} else {
    // 如果布尔表达式为 false,执行
}

示例

public class IfElseExample {
    public static void main(String[] args) {
        int x = 30;

        if (x < 20) {
            System.out.println("x 小于 20");
        } else {
            System.out.println("x 大于或等于 20");
        }
    }
}

3. if...else if...else 语句

适用于多个条件判断,当 if 条件不满足时,会依次检查 else if 语句。

语法

if (布尔表达式1) {
    // 如果布尔表达式1 为 true,执行
} else if (布尔表达式2) {
    // 如果布尔表达式2 为 true,执行
} else if (布尔表达式3) {
    // 如果布尔表达式3 为 true,执行
} else {
    // 如果上面条件都不满足,执行
}

示例

public class IfElseIfExample {
    public static void main(String[] args) {
        int x = 30;

        if (x == 10) {
            System.out.println("x 等于 10");
        } else if (x == 20) {
            System.out.println("x 等于 20");
        } else if (x == 30) {
            System.out.println("x 等于 30");
        } else {
            System.out.println("x 不是 10、20 或 30");
        }
    }
}

4. 嵌套 if...else 语句

可以在 ifelse 代码块内 再次嵌套 if 语句。

语法

if (条件1) {
    if (条件2) {
        // 如果条件1 和 条件2 均满足,执行
    }
}

示例

public class NestedIfExample {
    public static void main(String[] args) {
        int x = 30;
        int y = 10;

        if (x == 30) {
            if (y == 10) {
                System.out.println("x = 30, y = 10");
            }
        }
    }
}

(四) Switch Case 语句

switch case 语句用于 判断变量 是否与 多个可能值 相等,每个值称为一个 分支(case)

语法

switch(expression) {
    case value1:
        // 执行语句
        break; // 可选
    case value2:
        // 执行语句
        break; // 可选
    ...
    default: // 可选
        // 当所有 case 都不匹配时执行
}

注意:

  1. case 语句后跟要比较的 常量值,不能是变量或表达式。

  2. 如果没有 break 语句,后续 case 代码依然会继续执行,而且直接忽略了后续 case 的判断条件

switch case 适用数据类型

数据类型支持 switch说明
int✅ 支持常见数值匹配
char✅ 支持单个字符匹配
short✅ 支持
byte✅ 支持
String✅ Java 7+Java 7 及以上支持字符串匹配
long❌ 不支持需要转换为 int
float/double❌ 不支持由于浮点数精度问题,不适用于 switch

示例一

public class SwitchWithoutBreak {
    public static void main(String[] args) {
        int i = 1;
        switch (i) {
            case 0:
                System.out.println("0");
            case 1:
                System.out.println("1");
            case 2:
                System.out.println("2");
            default:
                System.out.println("default");
        }
    }
}

运行结果

1
2
default

思考:明明 i ≠2, 为什么会输出 2 ?

switch 语句在找到匹配的 case,如果没有 break,则会顺序执行后面的所有 case 代码,而不再进行匹配。直到遇到 break 或者到达 default

示例二

public class SwitchExample {
    public static void main(String[] args) {
        char grade = 'C';

        switch (grade) {
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
            case 'C':  // case 语句可以合并
                System.out.println("良好");
                break;
            case 'D':
                System.out.println("及格");
                break;
            case 'F':
                System.out.println("需要努力");
                break;
            default:
                System.out.println("未知等级");
        }
        System.out.println("你的等级是 " + grade);
    }
}

运行结果

良好
你的等级是 C

switch caseif-else 对比

switch caseif-else
适用情况适用于离散值intcharString适用于范围判断<><=>=
代码结构清晰简洁,但仅适用于相等比较适用于复杂逻辑,但代码较长
可读性更清晰可能嵌套较深
性能编译后更高效(使用跳转表)逐个判断,可能较慢