Object 和 String 的equals比较

先看一段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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值