《Effective JAVA学习笔记》之 equals()
博客专区 > 十一11 的博客 > 博客详情
《Effective JAVA学习笔记》之 equals()
十一11 发表于2年前
《Effective JAVA学习笔记》之 equals()
  • 发表于 2年前
  • 阅读 142
  • 收藏 5
  • 点赞 1
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的。 每天一个知识点,不贪多:equals()
import java.util.Arrays;

class Person {
	String name;
	int birthYear;
	byte[] raw;
	
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Person))
			return false;

		Person other = (Person) obj;
		return this.name.equals(other.name) && this.birthYear == other.birthYear && Arrays.equals(this.raw, other.raw);
	}
	
	@Override
	public int hashCode() {
		return name.hashCode()  + Arrays.hashCode(raw);
	}
}

如何理解:当你创造出了一个新类,你当然要制定某些规则。比如:新类new出来的两个实例,怎么样才能算一摸一样。这个相等规则就是equals()。 hashCode相当于这个类的身份ID,你可以自定义。当然不同的实例,hashCode肯定是不一样的。

  • 参数必须是Object类型,不能是外围类。

  • foo.equals(null) 必须返回false,不能抛NullPointerException。(注意,null instanceof 任意类 总是返回false,因此上面的代码可以运行。)

  • 基本类型域(比如,int)的比较使用 == ,基本类型数组域的比较使用Arrays.equals()。

  • 覆盖equals()时,记得要相应地覆盖 hashCode(),与 equals() 保持一致。

  • 参考: java.lang.Object.equals(Object)

  • 当x和y两个对象具有x.equals(y) == true ,你必须要确保x.hashCode() == y.hashCode()。

  • 根据逆反命题,如果x.hashCode() != y.hashCode(),那么x.equals(y) == false 必定成立。

  • 你不需要保证,当x.equals(y) == false时,x.hashCode() != y.hashCode()。但是,如果你可以尽可能地使它成立的话,这会提高哈希表的性能。

  • hashCode()最简单的合法实现就是简单地return 0;虽然这个实现是正确的,但是这会导致HashMap这些数据结构运行得很慢。

  • 参考:java.lang.Object.hashCode()


http://www.cnblogs.com/xudong-bupt/p/3960177.html



共有 人打赏支持
粉丝 7
博文 79
码字总数 19784
×
十一11
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: