关系操作符
关系操作符生成的是一个boolean(布尔)结果,它们计算的是操作数的值之间的关系。
如果关系是真实的,关系表达式会生成true(真);如果关系不真实,则生成false(假)。
关系操作符包括<,>,<=,>=,==以及不等于!=.
等于和不等于适用于所有的基本数据类型,而其他比较符不适用于boolean类型。
因为boolean值只能为true或false,“大于”和“小于”没有实际意义。
Testing object equivalence
测试对象的等价性
关系操作符==和!=适用于所有对象,但这两个操作符通常会让人迷惑。下面是个例子
//:operators/Equivalence.java
public class Equivalence{
public static void main(String [] args){
Integer n1=new Integer(47);
Integer n2=new Integer(47);
System.out.println(n1==n2);//false
System.out.println(n1!=n2);//true
}
}
///:~
尽管对象的内容相同,然而对象的引用却是不同的。而==和!=比较的就是对象的引用。
所以输出结果实际上先是false。再是true。
如果想比较两个对象的实际内容是否相同。必须使用所有对象都使用的特殊方法equals().
但是这个方法不适用于“基本类型”,基本类型直接使用==和!=即可。
下面举例说明如何使用:
//: operators/EqualsMethod.java
public class EqualsMethod{
public static void main(String [] args){
Integer n1=new Integer(47);
Integer n2=new Integer(47);
System.out.println(n1.equals(n2));//true
}
}
///:~
结果如我们所预料的那样。但事情并不总是那么简单,假设你创建了自己的类,就像下面这样:
//: operators/EqualsMethod2.java
//Default equals() does not compare contents
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
}
}
///:~
事情再次变得令人费解:结果又是false。这是由于equals()的默认行为是比较引用。
所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为、
大多数Java类库都实现了equals()方法,以便用来比较对象的内容,而非比较对象的引用、