首页 > 代码库 > 黑马程序员_Java基础之 equals 与 ==
黑马程序员_Java基础之 equals 与 ==
在我们写程序时经常会去比较两个变量是否相等,一般我们有两种方式去比较:equals与==,但是很多情况是不明就里,最后得出错误的结论。本文详解了equals与==。
Java程序中测试两个变量是否的两种方式:一种是利用==另一种是equals方法。当时用 == 来判断两个变量是否相等时,如果两个变量是基本数据类型变量且都是数值类型(不一定要去数据类型完全相同),则只要两个变量的值相等就返回true。
但是对于两个引用类型变量, 他们必须指向同一个对象时,== 才会返回true。==不可用于比较两个没有父子关系的对象。下面的程序就示范使用 == 来判断两种类型变量是否相等。
????public void test2()
????{
????????int it = 65;
????????float fl = 65.0f;
????????//将输出true
????????System.out.println("65和65.0f是否相等?" + (it == fl));
????????char ch = ‘A‘;
????????//将输出true
????????System.out.println("65和‘A‘是否相等?" + (it == ch));
????????String str1 = new String("hello");
????????String str2 = new String("hello");
????????//将输出false
????????System.out.println("str1和str2是否相等?"
????????????+ (str1 == str2));
????????//将输出true
????????System.out.println("str1是否equals str2?"
????????????+ (str1.equals(str2)));
????????//由于java.lang.String与EqualTest类没有继承关系,
????????//所以下面语句导致编译错误
????????int a=10;
????????System.out.println("hello" == a);
????}
运行上面的程序,可以看到65、65.0f和‘A‘相等,对于str1和str2,因为他们是引用型变量,他们分别指向两个通过new关键字创建的String对象,因此str1和str2两个变量不想等。
equals原理解析:
equals方法是Object类提供的实例方法,因此所以引用型变量都可以调用该方法来判断是否与其他变量相等。但是使用这种方法判断两个对象是否相等的标准和使用==是没有区别的。同样要求两个引用变量指向同一个对象才会返回true。因此这个Object类提供equals方法没有太大的实际意义,如果希望采用自定义的标准则应该重写equals方法,
String类就重写了改方法,其判断两个字符串相等的标准是只要两个变量的字符序列相同equals方法就返回true。下面代码即其实现原理。
????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;
????}
其实用我们自己的方式去重写equals方法,实现让不可能相等的对象相等。
class Person
{
????//重写equals方法,提供自定义的相等标准
????public boolean equals(Object obj)
????{
????????//不加判断,总是返回true,即Person对象与任何对象都相等
????????return true;
????}
}
//定义一个Dog空类
class Dog{}
public class OverrideEqualsError
{
????public static void main(String[] args)
????{
????????Person p = new Person();
????????System.out.println("Person对象是否equals Dog对象?"
????????????+ p.equals(new Dog()));
????????System.out.println("Person对象是否equals String对象?"
????????????+ p.equals(new String("Hello")));
????}
}
上面的例子定义了一个Person类,该类重写了equals方法,并且该方法总是返回true,也就是Person对象和任意引用类型变量进行equals方法都返回true,这就会造成Person对象和Dog对象相等的闹剧。希望通过这样一个闹剧帮助大家去学习equals与==的区别。
?
黑马程序员_Java基础之 equals 与 ==