一、在Java中,存在多种类型的运算符,包括算术运算符、关系运算符和逻辑运算符。以下是这些运算符的列表和简要说明:
算术运算符
- 加法运算符 (
+): 用于将两个操作数相加。 - 减法运算符 (
-): 用于从一个操作数中减去另一个操作数。 - 乘法运算符 (
*): 用于将两个操作数相乘。 - 除法运算符 (
/): 用于将第一个操作数除以第二个操作数。 - 取模运算符 (
%): 也称为余数运算符,用于求两个操作数相除的余数。 - 自增运算符 (
++): 将操作数的值增加1。 - 自减运算符 (
--): 将操作数的值减少1。 - 一元负号运算符 (
-): 取操作数的负值(反转其符号)。
关系运算符
- 等于运算符 (
==): 判断两个操作数的值是否相等。 - 不等于运算符 (
!=): 判断两个操作数的值是否不相等。 - 大于运算符 (
>): 判断第一个操作数是否大于第二个操作数。 - 小于运算符 (
<): 判断第一个操作数是否小于第二个操作数。 - 大于等于运算符 (
>=): 判断第一个操作数是否大于或等于第二个操作数。 - 小于等于运算符 (
<=): 判断第一个操作数是否小于或等于第二个操作数。
逻辑运算符
- 逻辑与运算符 (
&&): 如果两个操作数都是true,则结果为true。 - 逻辑或运算符 (
||): 如果两个操作数中至少有一个是true,则结果为true。 - 逻辑非运算符 (
!): 如果操作数是true,则结果为false,反之亦然。 - 逻辑异或运算符 (
^): 如果两个操作数的逻辑值不同,则结果为true。
注意:在Java中,逻辑与运算符(&&)和逻辑或运算符(||)具有“短路”行为。这意味着如果第一个操作数已经足够确定整个表达式的值(例如,在&&表达式中第一个操作数为false,或在||表达式中第一个操作数为true),那么第二个操作数将不会被求值。这种行为被称为“短路求值”或“最小求值”。
二、在Java中,& 和 && 都是逻辑运算符,但它们在执行时有一些重要的区别,这主要体现在它们的短路行为(short-circuiting behavior)和计算方式上。
- 短路行为(Short-circuiting):
&&(逻辑与且)运算符具有短路行为。这意味着当使用&&连接的两个条件表达式中,如果第一个表达式的结果为false,那么第二个表达式将不会被评估(计算),因为整个逻辑表达式的结果已经确定为false。&(逻辑与)运算符则没有短路行为。无论第一个表达式的结果如何,第二个表达式都会被评估。
- 计算方式:
- 在进行位运算时,
&还用作按位与运算符,它会对操作数的每一位进行与运算。但在逻辑运算的上下文中,&和&&的主要区别在于短路行为。
- 在进行位运算时,
- 性能:
- 由于
&&的短路行为,它在某些情况下可能会比&更快,因为它避免了不必要的计算。但是,如果两个条件都需要被评估,并且你知道第一个条件的结果不会影响第二个条件的执行(例如,两个条件都没有副作用),那么使用&和&&在性能上可能没有显著差异。
- 由于
- 使用场景:
- 当你确定两个条件都需要被评估时,或者你在进行位运算时,可以使用
&。 - 当你希望利用短路行为来避免不必要的计算,或者第一个条件的评估结果可能会影响第二个条件的执行时,应该使用
&&。
- 当你确定两个条件都需要被评估时,或者你在进行位运算时,可以使用
示例:
int x = 10; | |
int y = 0; | |
// 使用 & 运算符 | |
if ((x / y) > 0 & System.out.println("This will always be printed")) { | |
// 这里会抛出ArithmeticException,因为y为0,但后面的println仍然会被执行 | |
} | |
// 使用 && 运算符 | |
if ((x / y) > 0 && System.out.println("This will not be printed")) { | |
// 这里会抛出ArithmeticException,并且后面的println不会被执行 | |
} |
在上面的示例中,当使用&时,即使(x / y) > 0会导致ArithmeticException,System.out.println("This will always be printed")仍然会被执行。但是,当使用&&时,由于短路行为,当(x / y) > 0抛出异常时,后面的System.out.println("This will not be printed")将不会被执行。