HashSet集合存储自定义对象及注意事项
HashSet集合属于Set集合,不允许有重复元素;
如果想存储自定义对象,需要覆盖hashCode与equals方法,因为HashSet集合中元素的唯一性保证是靠:
1、先比较元素的hashCode,如果一样
2、再通过方法equals比较元素是否相等
若不等,则存入到HashSet当中。
所以如果你存储自定义对象,一定要覆盖此二方法。
而且,如果你删除元素或插元素,比较规则也是如上规则。才能保证插入元素与删除元素成功!
具体请看如下示例:
import java.util.HashSet;
import java.util.Iterator;
public class HashSetSummarize {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
operateObject();
}
public static void operateObject()
{
Prisoner prisoner1 = new Prisoner("xiashengbing", 32, 13.7);
Prisoner prisoner2 = new Prisoner("lifenghong", 35, 3.5);
Prisoner prisoner3 = new Prisoner("yangwei", 29, 10.2);
Prisoner prisoner4 = new Prisoner("dongyuxing", 21, 1);
Prisoner prisoner5 = new Prisoner("qingshan", 38, 6.5);
Prisoner prisoner6 = new Prisoner("lifenghong", 35, 3.5);
HashSet<Prisoner> hashSet = new HashSet<Prisoner>();
hashSet.add(prisoner1);
hashSet.add(prisoner2);
hashSet.add(prisoner3);
hashSet.add(prisoner4);
hashSet.add(prisoner5);
hashSet.add(prisoner6);
printHashSet(hashSet);
}
public static void printHashSet(HashSet<Prisoner> hashSet)
{
for (Iterator<Prisoner> iterator = hashSet.iterator(); iterator.hasNext();) {
Prisoner prisoner = iterator.next();
System.out.println(prisoner);
}
}
}
重点看如下片段:
import cn.itcast.list.Person;
public class Prisoner extends Person
{
private double sentenceDate;
public Prisoner(String name, int age, double sentenceDate) {
// TODO Auto-generated constructor stub
super(name, age);
this.setSentenceDate(sentenceDate);
}
public int hashCode()
{
int hashCode = this.getName().hashCode() + this.getAge() * 31;
return hashCode;
}
public boolean equals(Object object)
{
Prisoner prisoner = null;
if(object instanceof Prisoner)
{
prisoner = (Prisoner)object;
}
return (this.getName().equals(prisoner.getName()) && this.getAge() == prisoner.getAge() &&
this.getSentenceDate() == this.getSentenceDate());
}
public void setSentenceDate(double sentenceDate) {
this.sentenceDate = sentenceDate;
}
public double getSentenceDate() {
return sentenceDate;
}
public String toString(){
return this.getName()+"::"+this.getAge()+"::"+ this.sentenceDate;
}
}