/*
往hashSet集合中存入自定义对象。
姓名和年龄相同为同一个人,重复元素。
*/
一、因为new出来的对象hash值不同,直接存储,不会调用equals方法,所以复写了hashCode值,让返回的值一样,会调用equals方法
import java.util.*;
class Student
{
private String name;//定义私有姓名,年龄,成绩三个属性
private int age;
Student(String name,int age)//通过构造函数进行初始化
{
this.name=name;
this.age=age;
}
public void setName(String name)//分别提供set和get方法
{
this.name=name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
public boolean equals(Object obj)//覆盖equals方法
{
if(!(obj instanceof Student))
return false;
Student p=(Student)obj;
return this.name.equals(p.name)&&this.age==p.age&&this.score==p.score;
}
public int hashCode()
{
return name.hashCode()+age;
}
}
}
}
class SortScore
{
public static void main(String[] args)
{
HashSet s=new HashSet();
s.add(new Student("张三",36));
s.add(new Student("李四",35));
s.add(new Student("赵六",34));
s.add(new Student("王五",32));
Iterator it=s.iterator();
while(it.hasNext())
{
Student p=(Student)it.next();
System.out.println(p.getName()+"::"+p.getAge());
}
二、覆盖了hashcode中return name.hashCode()+age,hash值不一样,那跟不覆盖hash值结果一样(不覆盖之前返回的哈希值不同),不会调用equals方法,那这样有何意义呢?
import java.util.*;
class Student
{
private String name;//定义私有姓名,年龄,成绩三个属性
private int age;
Student(String name,int age)//通过构造函数进行初始化
{
this.name=name;
this.age=age;
}
public void setName(String name)//分别提供set和get方法
{
this.name=name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
public boolean equals(Object obj)//覆盖equals方法
{
if(!(obj instanceof Student))
return false;
Student p=(Student)obj;
return this.name.equals(p.name)&&this.age==p.age&&this.score==p.score;
}
public int hashCode()
{
return name.hashCode()+age;
}
}
}
}
}
class SortScore
{
public static void main(String[] args)
{
HashSet s=new HashSet();
s.add(new Student("张三",36));
s.add(new Student("李四",35));
s.add(new Student("赵六",34));
s.add(new Student("王五",32));
Iterator it=s.iterator();
while(it.hasNext())
{
Student p=(Student)it.next();
System.out.println(p.getName()+"::"+p.getAge());
}
|
|