一、在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")
将不会被执行。