java中的equals理解

在刚开始学习类中的相关的方法时,由于继承和重写,可能会有些方法我们不能很好的理解,很有可能会混淆。下面只是本人自己对equals方法的理解,自己的总结,自己学的的东西,自己总结,若有错望指正。

首先我们要知道equals方法是哪里来的,我们知道如果我们创建一个新类,这个类默认继承的类是Object。Object类中有方法equals,所以这个方法就会被继承下来。既然知道了equals的来源,我们可以看看Object类中的equals方法的底层实现。

//这就是Object的Equals方法的底层实现。(底层实现是使用“==”来实现的,这点很重要)

public boolean equals(Object obj) {
        return (this == obj);
    }

看到了底层的实现,现在我们需要弄清楚的是“==”和equals的区别?

首先我们看看“==”的使用,1.对于基本数据类型,“==”用来比较值得大小是否相等

                                               2.对于抽象数据类型,“==”用来比较引用(我也当做是地址,只要两个抽象数据类型的地址不一样,返回的是false)

再来看看equals的使用,因为equals方法是用==来实现的,按理来说应该一样的,但是这个方法会被重写,所以作用自然就会根据自己的重写来使用

                                               1.对于String类型,比较的是两个字符串的内容是否一样。并不是地址

                                               2.对于自己新建的类,比较的是两个对象的引用。(前提是自己没有重写方法equals)

有人会问,String类型也是抽象数据类型,为什么它调用equals方法是比较的内容,而不是对象的引用。要看清这个问题,我们要去看看类String的方法equals的底层实现。

//这就是String类的equals方法的底层实现,显然和Object中的不一样了。(解释:如果是同一个对象,返回true,如果不是,检查字符串,全部一样返回true,有一个不一样就会返回false)string类重写了方法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;
    }


对于==的使用,我们还有一个常量池(缓冲池)的问题。下面的例子应该可以很容易看到。

/*
 * 运行结果
 * s1==s2
 * s1 equals s2
 * 原因:
 * 常量池的问题(think in java 上边叫做缓冲池)
 * 刚开始定义s1的时候,赋值一个常量给s1,然后会把常量加入到常量池中
 * 后来在定义的时候,如果在常量池中能够找到这个常量,那么会直接引用这个地址
 * ==比较的是地址,所以会显示地址相同
 * 
 * 替换成为String s2=new String("aaa");
 * 运行结果
 * s1!==s2
 * s1 equals s2
 * 原因:
 * 虽然字符串一样  但是两者的地址不同   因为使用new来新建一个string类型的变量  相当于
 * 本来有但是我不用,我要新建一个。所以两者的地址不同。
 * 
 * 
 * equals的讲解:
 * equals这个方法都是从object中继承得来的,在object的底层,equals的方法体就是用==
 * 来编写的,所以如果继承来的equals的没有被重写,那么这个方法的作用和==应该一样都是比较
 * 地址
 * 下面程序中的string类中使用的equals  是重写后的equals,重写后比较的是字符串的内容
 * 可以到equals的底层去查看。
 */
public class Test2 {
 public static void main(String[] args) {
String s1="aaa";
String s2="aaa";
//String s2=new String("aaa");
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!==s2");
}
if(s1.equals(s2)){
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}
}


}

希望对初学者有一定的帮助。

你可能感兴趣的:(java,equals)