40.关系与布尔运算符

阅读更多

1.关系运算符

 

在Java中,提供了完整了关系运算符。Java中,关系运算符包括:>,<,>=,<=,==,!=,用来对两个简单类型操作数进行比较运算,所组成的表达式结果为boolean类型的值true或false。

注意:除了“==”和“!=”外,其他的关系运算符都不能用在boolean类型的操作数中。

 

在这边需要提醒注意的是,在Java中,“不等于”是用“!=”表示的,而不是一些编程语言的“<>”,而等于也是和一些编程语言不一样,它使用“==”而非“=”,在Java中,“=”用于赋值操作,而非关系运算符。


“==”和“!=”除了用于简单类型的操作数外,还可以用于比较引用类型数据。

 

2.布尔运算符

 

布尔运算符也称逻辑运算符,包括:!,&,|,^,&&,||,这些运算符分别实现“非”、“与”、“或”、“异或”、“短路与”、“短路或”等逻辑运算。

 

和关系运算一样,逻辑运算结果也是布尔类型值true或false,Java语言中逻辑运算规则与其它语言中的相近。


在布尔运算符中,需要特别说明的是,短路与“&&”和短路或“||”,这两个运算符是按照“短路”的方式进行求值的,也就是说,如果第一个表达是已经可以判断出整个表达式的值时,就不进行后面的运算了。

 

例如,当对表达式a&&b进行运算时,如果表达式a的值为false,将不对b的值进行计算。而当对表达式a||b进行运算时,如果a 的值为true,将不对b的值进行计算。

 

请看下面的例子。

 

public class ShortCircuit {
 public static void main(String[] agrs) {
  ShortCircuit sc = new ShortCircuit();
  System.out.println("短路或运算");
  System.out.println(sc.Ma() || sc.Mb() || sc.Mc());
  System.out.println("短路与运算");
  System.out.println(sc.Ma() && sc.Mb() && sc.Mc());
 }

 boolean Ma() {
  System.out.println("Ma()被调用!");
  return 1 < 2;// true
 }

 boolean Mb() {
  System.out.println("Mb()被调用!");
  return 1 == 2;// false
 }

 boolean Mc() {
  System.out.println("Mc()被调用!");
  return 1 > 2;// false
 }
}

上面的程序中,因为方法Ma()的值为true,而“或”运算中如果有一个表达式为真(true),则整个表达式均为真(true),因此,无需计算后面方法Mb()和方法Mc()这两个表达式就可以得到整个表达式的值了。

 

而第二条“短路与”语句,因为在逻辑“与”运算中,只需要一个表达式的值为假(false),则整个表达式的值都为假(false)。Ma()为真(true),所以将进行第二个表达式的运算,它将调用方法Mb(),而此时,Mb()方法的返回值为假(false),所以将不用进行后面的运算了。

编译运行上面的程序,将得到如下的输出:
短路或运算
Ma()被调用!
true
短路与运算
Ma()被调用!
Mb()被调用!
false


注意:运算符“&&”和“&”、“||”和“|”所求得的结果是一样的,它们的区别在于,“&”和“|”不会进行“短路”运算,而是会计算运算符两边的各个参数的值。

 

在实际编程中,如无特殊要求,建议均使用短路运算符。

 

因为在实际编程中,如果需要对两个逻辑布尔表达式进行与或运算,第一点,使用短路运算,在可以确认布尔运算结果的情况下,不需对第二个布尔运算进行计算,节省了运算资源时间。更重要的一点,很多时候两个布尔逻辑表达式是相关联的。

 

比如在一个与运算中,第一个布尔运算为true的情况下,再进行第二个布尔运算,从而得到结果是合理的。如果第一个已经是false了,若不是短路运算符的话,仍会执行第二个布尔运算,但实际情况是,第一个运算不通过的话,第二个布尔运算是会发生异常的。

 

看下面的例子。以Student类为例:

 

Student s = null;

 

if(s !=null && s.getAge()>18){

  System.out.println("成年");

}

 

如果不使用短路与,在s为null,最终结果肯定是false的情况下,Java运行仍会执行第二个布尔运算,但是此时s为null,调用null引用对象,会发生空指针引用异常的。

 

但如果使用短路运算,则不会进行第二个布尔运算,就不会发生这种情况了。避免发生难以发觉处理的异常信息。

你可能感兴趣的:(40.关系与布尔运算符)