Object 和 String 的equals比较

来源:互联网 发布:java创建二叉树 编辑:程序博客网 时间:2024/05/11 22:51

先看一段String 和 一个普通类的equals方法的比较


/** * Object 中的equlas的使用 * @author dell * */public class TestEquals {    public static void main(String [] args){                /** ================== String中有重写的equals===========================*/        String str1 = new String("123");            String str2 = new String("123");                    System.out.println(str1.equals(str2));    //out:true        System.out.println(str1.equals(str1));    //out:true            /**==================== Dog中没有重写equals ========================= */        //dog1 与 dog2 的变量值相同        Dog dog1 = new Dog("dog");        Dog dog2 = new Dog("dog");        System.out.println(dog1.equals(dog2));    //out:false                //dog1与dog2的变量引用相同        dog1.name = dog2.name;        System.out.println(dog1.equals(dog2));    //out:false                //dog1与dog2的引用相同        dog1 = dog2;        System.out.println(dog1.equals(dog2));    //out:true                /**==================== Cat中重写equals,比较Cat中name属性 ========================= */                Cat cat1 = new Cat("cat");        Cat cat2 = new Cat("cat");        System.out.println(cat1.equals(cat2));    //out:true                    }}/** * Dog 中的没有equals方法的重写 * @author dell * */public class Dog {    String name;        public Dog(String name){        this.name = name;    }}/** * Cat 重写了equals方法 * @author dell * */public class Cat {    String name;        public Cat(String name){        this.name = name;    }    @Override    public boolean equals(Object anoObject) {        if (this == anoObject) { // 如果两个对象的引用相同            return true;        }        if (anoObject instanceof Cat) {            Cat anoCat = (Cat) anoObject;            if(this.name.equals(anoCat.name)){                return true;            }        }        return false;    }}



str1和str2的值相等,String的equals在字符串中比较的是对象的值,不是引用,和==有区别,这里不做解释

第一个输出是true,equals比较String对象中的值,两个都是"123",所以输出true

同样的写法,为什么输出比较两个dog的时候输出却是false

Dog是Object 的子类,String也是Object的子类,区别在于String中重写了Object中的equals方法

下面附上String和Object 的源码


 /**   * String 的equals方法  */ public boolean equals(Object anObject) {if (this == anObject) {    return true;}if (anObject instanceof String) {    String anotherString = (String)anObject;    int n = count;    if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {    if (v1[i++] != v2[j++])return false;}return true;    }}return false;    }/** * Obejct中的equals方法 */public boolean equals(Object obj) {return (this == obj);    }

String的equals方法中先是判断两个对象的引用是否相同,在判断字符串的长度是否相同,然后判断每个字符串相同...

而Object中的equals只判断对象的引用是否相同,如果引用不同直接返回false


所以说当dog1对象使用equals方法时候调用的Object 中的equals方法,判断的是dog1和dog2的引用是否相等

当然不相等,所以输出false

再看Cat类,Cat类中实现了对Object 方法的重写,判断Cat中的name属性的值是否相等。而不是判断两个cat对象的引用是否相等

所以输出true

0 0