equals与"=="的区别和理解

equals与==的区别:

equals用于检测两个对象的内容是否相等(即对中的内容是否相同)

==在用于比较基本数据类型时,两者值相同,比较结果为true

    在用于比较引用时,若引用指向内存中的同一对象,比较结果为true(==比较的是栈中的内容是否相同)

 

为了更清楚的了解它们的工作过程,先来看看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;
    }

 可以看到,equals默认调用了“==”比较方法,在传入参数为String类时,重写了这个方法,进行字符的逐个比较。所以,equals可以用来比较字符串是否相同。

所以,equals具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么它和==号等价。

下面测试两者的作用:

package test;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str1 = "world";// 直接赋值,该字符串放在常量池(在堆中)中
		String str2 = new String("world") ;	// 通过new赋值,新建了一个对象 
		String str3 = str2 ;	// 传递引用,str放在栈内存中 
		System.out.println("str1 == str2 : " + (str1==str2)) ;	
		System.out.println("str1 == str3 : " + (str1==str3)) ;	
		System.out.println("str2 == str3 : " + (str2==str3)) ;	
		System.out.println("======================================================");
		System.out.println("str1 equals str2 : " + (str1.equals(str2))) ;	
		System.out.println("str1 equals str3 : " + (str1.equals(str3))) ;	
		System.out.println("str2 equals str3 : " + (str2.equals(str3))) ;	

	}

}

 输出结果如下:

str1 == str2 : false 不是同一个对象,地址不同 str1 == str3 : false 不是同一个对象,地址不同 str2 == str3 : true 同一对象 ====================================================== str1 equals str2 : true str1 equals str3 : true str2 equals str3 : true

由于equals重写了比较方法,只比较两个字符串的值是否相同。

 String str = "World";中,str放在栈内存中,“World”放在堆内存中,str是一个指向“World”首地址的引用。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值