`
songhongchen
  • 浏览: 122740 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

重载equals方法就一定要要重载hashCode方法

阅读更多
    在进行对象之间的比较的时候,一般都会override equals方法,而hashCode的override很多时候都会被忽略。hashCode方法一般都被认为是用来判断两个对象是不是同一个引用的,它返回一串散列码,这个散列码的主要用途是进行Hash存储时,作为键用的,加快查找对象的速度。一般都会以31 29这样的素数作为基数,主要目的是为了减少在一个大的集合中键值的重复,导致冲突的情况发生,以提高性能。
有关深入HashCode方法详见:http://blog.csdn.net/axman/archive/2004/11/26/195159.aspx

下面有个Bean,在只重载了equals方法后,执行插入Set后的个数和重载了equals与hashCode方法两个方法后的Set集合中的对象个数:
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class ListSet
{
	public static void main(String... a)
	{
		Set<UserBean> set = new HashSet<UserBean>();
		Date date = new Date();
		UserBean ub;
		for (int i = 0; i < 20; i++)
		{
			ub = new UserBean();
			ub.setUsername("javaeye");
			ub.setPassword("javaeye");
			ub.setSex(i % 2);
			ub.setBirthDay(date);
			set.add(ub);
		}
		System.out.println("Set中的UserBean对象个数:" + set.size());
	}
}

class UserBean
{
	private String username;
	private String password;
	private int sex;
	private Date birthDay;

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		final UserBean other = (UserBean) obj;
		if (birthDay == null)
		{
			if (other.birthDay != null) return false;
		}
		else if (!birthDay.equals(other.birthDay)) return false;
		if (password == null)
		{
			if (other.password != null) return false;
		}
		else if (!password.equals(other.password)) return false;
		if (sex != other.sex) return false;
		if (username == null)
		{
			if (other.username != null) return false;
		}
		else if (!username.equals(other.username)) return false;
		return true;
	}
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public int getSex()
	{
		return sex;
	}
	public void setSex(int sex)
	{
		this.sex = sex;
	}
	public Date getBirthDay()
	{
		return birthDay;
	}
	public void setBirthDay(Date birthDay)
	{
		this.birthDay = birthDay;
	}
}

执行结果是:Set中的UserBean对象个数:20
而加了hashCode方法后:
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class ListSet
{
	public static void main(String... a)
	{
		Set<UserBean> set = new HashSet<UserBean>();
		Date date = new Date();
		UserBean ub;
		for (int i = 0; i < 20; i++)
		{
			ub = new UserBean();
			ub.setUsername("javaeye");
			ub.setPassword("javaeye");
			ub.setSex(i % 2);
			ub.setBirthDay(date);
			set.add(ub);
		}
		System.out.println("Set中的UserBean对象个数:" + set.size());
	}
}

class UserBean
{
	private String username;
	private String password;
	private int sex;
	private Date birthDay;

	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + ((birthDay == null) ? 0 : birthDay.hashCode());
		result = prime * result + ((password == null) ? 0 : password.hashCode());
		result = prime * result + sex;
		result = prime * result + ((username == null) ? 0 : username.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj)
	{
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		final UserBean other = (UserBean) obj;
		if (birthDay == null)
		{
			if (other.birthDay != null) return false;
		}
		else if (!birthDay.equals(other.birthDay)) return false;
		if (password == null)
		{
			if (other.password != null) return false;
		}
		else if (!password.equals(other.password)) return false;
		if (sex != other.sex) return false;
		if (username == null)
		{
			if (other.username != null) return false;
		}
		else if (!username.equals(other.username)) return false;
		return true;
	}
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public int getSex()
	{
		return sex;
	}
	public void setSex(int sex)
	{
		this.sex = sex;
	}
	public Date getBirthDay()
	{
		return birthDay;
	}
	public void setBirthDay(Date birthDay)
	{
		this.birthDay = birthDay;
	}
}

执行结果是:Set中的UserBean对象个数:2
1
0
分享到:
评论

相关推荐

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

    Java编程中避免equals方法的隐藏陷阱介绍

    Java编程中避免equals方法的隐藏陷阱介绍 Java编程中避免equals方法的隐藏陷阱介绍是一篇重要的技术文章,主要介绍了Java编程中避免equals...避免equals方法的隐藏陷阱需要我们小心地重载equals方法,避免常见的陷阱。

    Java高效编程指南.doc

    - **equals方法的重载**:当类需要实现逻辑等价测试时,应重载equals方法,确保与hashCode方法一起使用。如果类的实例是唯一的或者不需要逻辑等价性,则不必重载。 - **hashCode方法的重载**:与equals方法一起...

    java面试重点总结

    综上所述,Java面试准备中,需要关注的关键点包括但不限于反射机制、方法的重写与重载、equals和hashCode的正确实现以及集合的内部实现原理等。此外,对于Web开发的基础知识也需要有充分的了解。

    java基础面试题.doc

    2.如果要重写一个对象的 equals 方法,还需要重写该对象的 hashCode 方法,以确保对象的哈希码正确。 六、Java 中的继承和多态 1. Java 中的继承是一种实现代码重用的机制,子类可以继承父类的属性和方法。 2. ...

    java程序员面试宝典

    这是因为equals方法和hashCode方法是两个独立的方法,equals方法用于比较两个对象的值是否相等,而hashCode方法用于生成对象的哈希码。 5. 不可以继承String类,因为String类是final类,不能被继承。 6. 当一个...

    Java 22道基础面试题.docx

    7. equals 方法和 hashCode 方法:如果重写了 equals 方法,就一定要重写 hashCode 方法,因为两个对象相等那么 hashCode 值也得相同。 8. 类的初始化顺序:类的初始化顺序是父类静态成员变量、父类静态代码块、...

    Java综合面试资料集

    3. hashCode 和 equals 方法的相关规定:当 equals 方法被覆盖时,hashCode 方法也必须被覆盖。 IO 流知识点: 1. BIO、NIO、AIO:BIO 是阻塞式 IO,NIO 是非阻塞式 IO,AIO 是异步 IO。 2. Files 的常用方法:...

    Java面试宝典Beta6.0.pdf

    本节课主要讲解Java基础知识,包括跨平台性、逻辑运算符、构造器、break、continue、return语句、equals和hashCode方法、String类继承、值传递和引用传递等内容。 1. 跨平台性 Java语言编写的程序,一次编译后,...

    JAVA语言程序设计-第四章 方法

    最后,JAVA还提供了几种特殊的方法,如构造器(用于初始化对象),`equals()`和`hashCode()`(用于比较对象的平等性),以及`toString()`(用于返回对象的字符串表示)。 综上所述,JAVA语言程序设计中的第四章方法...

    提高代码质量的方法.

    - 覆写equals方法时要处理null值,同时覆写hashcode以保持一致性。 - 推荐覆写toString方法,提供更友好的输出。 - 使用package-info.java为包提供元数据。 4. **字符串操作**: - 使用字符串直接量赋值,提高...

    Java方向如何准备BAT技术面试答案(汇总版).pdf

    但是hashCode相等时,equals不一定相等。在使用集合框架存储对象时,如果重写了equals方法,也应该重写hashCode方法,以保证对象的一致性。 9. 抽象类和接口的区别: - 语法层次:抽象类可以用abstract关键字定义,...

    2_Offer--面试小抄第二版 亮白 By 库森.pdf

    override、重写、私有方法、静态资源、非静态资源、面向对象、面向过程、多态、重载、重写、hashCode、equals、String、StringBuffer、StringBuilder、字符串常量池、包装类型、自动装箱、自动拆箱、反射、泛型、...

    职来职往Java万字入门面试题

    以下是一些常见的Java面试知识点,涉及JDK、JRE、JVM的区别,以及hashCode()和equals()的关系,String、StringBuffer、StringBuilder的区别,泛型中extends和super的含义,==和equals方法的区别,重载与重写的概念,...

    java2022面试宝典

    两个对象如果equals()方法返回true,那么它们的hashCode()方法应该返回相同的值。反之,如果两个对象的hashCode()相同,它们可能相等也可能不等,此时需要进一步调用equals()进行判断。在集合框架中,如HashSet和...

    JAVA第一阶段测试题及答案.docx

    `Object` 类中定义了几个重要的方法,包括 `toString()` 方法、`equals()` 方法和 `hashCode()` 方法等。 本资源摘要信息涵盖了 Java 编程语言的基本概念和技术,为 Java 开发者提供了详细的知识点。

    Java程序员必备面试1000题精选

    当两个对象相等(equals方法返回true)时,它们的hashCode必须相等。 8. **equals与hashCode的关系**: 对于自定义类,如果重写了equals,通常也需要重写hashCode,以保持一致性原则:如果两个对象相等,那么它们...

Global site tag (gtag.js) - Google Analytics