这是我的第一堂课
public class MainClass {
public static void main(String args[])
{
java.util.Set s=new java.util.HashSet();
s.add(new Integer(10));
s.add(new Integer(1));
s.add(new Integer(5));
s.add(new Integer(3));
s.add(new Integer(6));
s.add(new Integer(9));
s.add(new User("John",25));
s.add(new User("John",25));
java.util.Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
这是我的第二堂课
public class User {
String name;
int age;
public User(String name,int age)
{
System.out.println("I am in constructor");
this.name=name;
this.age=age;
}
@Override
public boolean equals(Object obj)
{
System.out.println("I am in equals");
User u=(User)obj;
if(this.age==u.age)
{
return this.name.equals(u.name);
}
else
{
return false;
}
}
@Override
public int hashCode()
{
System.out.println("I am in hash code");
return this.name.hashCode()+this.age;
}
@Override
public String toString()
{
System.out.println("I am in to String");
return String.format("Name: %s", this.name);
}
}
输出
I am in constructor
I am in hash code
I am in constructor
I am in hash code
I am in equals
1
I am in to String
Name: John
3
5
6
9
10
我的问题是如何比较这些元素?
答案 0 :(得分:3)
这是顺序:
- 第一个输出在User构造函数中。
- 然后计算哈希以将对象存储在HashSet结构中,因此您有一个来自hashCode方法的输出
- 它与数字1相同,但对于第二个用户。
- 与第2位相同,但第二位用户。
- 因为User中的hashCode方法是按用户的年龄计算的,所以两个用户都有相同的哈希值,所以equals方法必须是 调用以验证对象是否相同。 (这是因为Java中的2个对象即使它们具有相同的哈希码也不必相同)
- 现在您正在打印HashSet中不包含任何顺序的所有对象,因此您可以随机获取所有元素 订购。 (请记住,任何Set中的对象都是唯一的)
- 因为您覆盖了toString方法,所以它会打印User对象的内容。
醇>
作为提示:从1.5版开始,在Java中使用原始类型的任何数据结构并不是一个好主意。看看泛型。
答案 1 :(得分:1)
每个对象都从java.lang.Object
继承hashCode()和equals()的默认实现。这就是为什么每个对象都可以用在基于散列的集合中的原因。
Object
中这两个函数的实现显然非常基础,但确保hashCode()
和equals()
的契约得到满足,特别是a.equals(b) ==> a.hashCode() == b.hashCode()
语句。