【JAVA】 关系运算符&短路

关系运算符(Relational operators)

关系运算符生成的是一个“布尔”(Boolean)结果。关系真,生成true;若关系假,生成false。
关系运算符包括
小于(<)(less than)、
大于(>)(greater than)、
小于或等于(<=)(less than and equal to)、
大于或等于(>=)(greater than and equal to)、
等于(==)(equivalent)
不等于(!=)(not equivalent)。

==和!=适用于所有主类型,但其他比较符不适用于boolean类型。

参考下面的例子:

public class Equivalence {
	public static void main(String[] args) {
		Integer n1 = new Integer(47);
		Integer n2 = new Integer(47);
		System.out.println(n1 == n2);
		System.out.println(n1 != n2);
	}
} 

输出false 和 true
原因:
两个Integer对象都是相同的。但尽管对象的内容相同,句柄却是不同的
而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。
比较内容用方法equals(),它用于比较两个对象引用所指的内容是否相同。
但该方法不使用原始类型,原始类型直接用==和!=就可以了

但要注意:

class Value {
	int i;
}
public class EqualsMethod2 {
	public static void main(String[] args) {
		Value v1 = new Value();
		Value v2 = new Value();
		v1.i = v2.i = 100;
		System.out.println(v1.equals(v2));
	}	
} 

结果又是false。这是因为equals()的默认行为是比较句柄。除非重写(override)equals()方法,才能达到期望结果。
参考equals()方法的原码

public boolean equals(Object anObject) {
  if (this == anObject) {
      return true;
  }
  if (anObject instanceof String) {
      String anotherString = (String)anObject;
      int n = value.length;
      if (n == anotherString.value.length) {
          char v1[] = value;
          char v2[] = anotherString.value;
          int i = 0;
          while (n-- != 0) {
              if (v1[i] != v2[i])
                  return false;
              i++;
          }
          return true;
      }
  }
  return false;
}

如果参数的类型不是String,则用==进行比较

逻辑运算符(Logical operators)

逻辑运算符AND(&&)、OR(||)以及NOT(!)能生成一个布尔值(true或false)——以自变量的逻辑关系为基础

注意:浮点数的比较非常严格,即使一个数字仅在小数部分与另一个数字存在极微小的差异,仍然认为它们是“不相等”的。即使一个数字只比零大一点点(例如2不停地开平方根),它仍然属于“非零”值(nonzero)。

短路(short-circuiting)

对表达式进行逻辑求值直到明确地确定表达式的真或假。其结果是,逻辑表达式的后半部分不进行求值
见下例:

int  a=3,b=6;
if(a++>3&&--b<=6)   //当第一个条件为false时,第二个条件不判断不执行
		System.out.println("ok");//注意此处a先判断再++
else
		System.out.println("error");
System.out.println("a="+a+"\tb="+b);  //4   6

int  a=3,b=6;
if(a++>=3 || --b<=6)   //当第一个条件为true时,第二个条件不判断不执行
		System.out.println("ok");
else
		System.out.println("error");
System.out.println("a="+a+"\tb="+b);   //4  6

注意与按位与&和按位或/的区别

int  a=3,b=6;
if(a++>3&--b<=6)   //这两个条件都判断并执行
	System.out.println("ok");
else
	System.out.println("error");
System.out.println("a="+a+"\tb="+b);

int  a=3,b=6;
if(a++>=3| --b<=6)   //这两个条件都判断并执行
	System.out.println("ok");
else
	System.out.println("error");
System.out.println("a="+a+"\tb="+b);  // 4  5
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值