java 通过源码看String的Equals与==

本文详细解析了 Java 中 String 类的 equals 方法实现原理,并对比 Object 类的 equals 方法,阐述了如何正确判断两个 String 对象内容的相等性,以及重写 equals 方法时应注意的问题。

今天测试一段代码,死活不对!遂逐一检查,终于发现是在判断两个String对象是否相等时出错了!我用的是==,导致每次比较都是比较内存地址是否相同,而不是判断内容。为了让自己长点记性,于是有了这篇博客。

首先看下Object的Equals的源码

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

很明显,如果在我们编写的类中不重写equals方法的话,它和==的作用是一样的。

再看下让我废了一下午时间的String的源码

 

  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;
    }


这段代码有几个看点:1.自反性:通过判断this==anObject达到的

                                     2.对称性、传递性、一致性:通过判断两个字符串的内容是否相等达到的

事实上,对于重写equals方法,有些需要注意的地方,详细的可以看《Effective Java 2》的第八和第九条。http://yuedu.baidu.com/ebook/2c57b4717fd5360cba1adbf3.html

http://download.csdn.net/detail/wangneng100/539432


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值