关系运算符(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