在进行对象之间的比较的时候,一般都会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
分享到:
相关推荐
第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...
Java编程中避免equals方法的隐藏陷阱介绍 Java编程中避免equals方法的隐藏陷阱介绍是一篇重要的技术文章,主要介绍了Java编程中避免equals...避免equals方法的隐藏陷阱需要我们小心地重载equals方法,避免常见的陷阱。
- **equals方法的重载**:当类需要实现逻辑等价测试时,应重载equals方法,确保与hashCode方法一起使用。如果类的实例是唯一的或者不需要逻辑等价性,则不必重载。 - **hashCode方法的重载**:与equals方法一起...
综上所述,Java面试准备中,需要关注的关键点包括但不限于反射机制、方法的重写与重载、equals和hashCode的正确实现以及集合的内部实现原理等。此外,对于Web开发的基础知识也需要有充分的了解。
2.如果要重写一个对象的 equals 方法,还需要重写该对象的 hashCode 方法,以确保对象的哈希码正确。 六、Java 中的继承和多态 1. Java 中的继承是一种实现代码重用的机制,子类可以继承父类的属性和方法。 2. ...
这是因为equals方法和hashCode方法是两个独立的方法,equals方法用于比较两个对象的值是否相等,而hashCode方法用于生成对象的哈希码。 5. 不可以继承String类,因为String类是final类,不能被继承。 6. 当一个...
7. equals 方法和 hashCode 方法:如果重写了 equals 方法,就一定要重写 hashCode 方法,因为两个对象相等那么 hashCode 值也得相同。 8. 类的初始化顺序:类的初始化顺序是父类静态成员变量、父类静态代码块、...
3. hashCode 和 equals 方法的相关规定:当 equals 方法被覆盖时,hashCode 方法也必须被覆盖。 IO 流知识点: 1. BIO、NIO、AIO:BIO 是阻塞式 IO,NIO 是非阻塞式 IO,AIO 是异步 IO。 2. Files 的常用方法:...
本节课主要讲解Java基础知识,包括跨平台性、逻辑运算符、构造器、break、continue、return语句、equals和hashCode方法、String类继承、值传递和引用传递等内容。 1. 跨平台性 Java语言编写的程序,一次编译后,...
最后,JAVA还提供了几种特殊的方法,如构造器(用于初始化对象),`equals()`和`hashCode()`(用于比较对象的平等性),以及`toString()`(用于返回对象的字符串表示)。 综上所述,JAVA语言程序设计中的第四章方法...
- 覆写equals方法时要处理null值,同时覆写hashcode以保持一致性。 - 推荐覆写toString方法,提供更友好的输出。 - 使用package-info.java为包提供元数据。 4. **字符串操作**: - 使用字符串直接量赋值,提高...
但是hashCode相等时,equals不一定相等。在使用集合框架存储对象时,如果重写了equals方法,也应该重写hashCode方法,以保证对象的一致性。 9. 抽象类和接口的区别: - 语法层次:抽象类可以用abstract关键字定义,...
override、重写、私有方法、静态资源、非静态资源、面向对象、面向过程、多态、重载、重写、hashCode、equals、String、StringBuffer、StringBuilder、字符串常量池、包装类型、自动装箱、自动拆箱、反射、泛型、...
以下是一些常见的Java面试知识点,涉及JDK、JRE、JVM的区别,以及hashCode()和equals()的关系,String、StringBuffer、StringBuilder的区别,泛型中extends和super的含义,==和equals方法的区别,重载与重写的概念,...
两个对象如果equals()方法返回true,那么它们的hashCode()方法应该返回相同的值。反之,如果两个对象的hashCode()相同,它们可能相等也可能不等,此时需要进一步调用equals()进行判断。在集合框架中,如HashSet和...
`Object` 类中定义了几个重要的方法,包括 `toString()` 方法、`equals()` 方法和 `hashCode()` 方法等。 本资源摘要信息涵盖了 Java 编程语言的基本概念和技术,为 Java 开发者提供了详细的知识点。
当两个对象相等(equals方法返回true)时,它们的hashCode必须相等。 8. **equals与hashCode的关系**: 对于自定义类,如果重写了equals,通常也需要重写hashCode,以保持一致性原则:如果两个对象相等,那么它们...