存入Set的元素必须是唯一的,Set并不会保证元素不会重复,Set必须改写equals方法以确保元素的唯一性。Set需要一种方式来维护顺序,不同的Set类型会有不同的实现。
HashSet是为了快速查找而设计的Set,存入HashSet的元素必须实现hashCode。如果我们没有实现hashCode也能通过,并且没有运行错误,但是那样的话会违背Set的原则,因为它会使用默认的hashCode方法,这是合法的,尽管他是不正确的。
TreeSet可以实现元素的自然排序,但是前提是你会正确地实现Comparator或者对象本身具有你想要的比较方式。
@Override
public int hashCode () {
final int prime = 31;
int result = 1;
result = prime * result + Score;
result = prime * result + (( name == null ) ? 0 : name. 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 ;
Poet
other = ( Poet) obj;
if ( Score != other. Score)
return false ;
if ( name == null ) {
if ( other. name != null )
return false ;
} else if (! name. equals (other .name ))
return false ;
return true ;
}
String name;
int Score ;
public int compareTo (Object
o ) {
// TODO Auto-generated method
stub
if (! (o instanceof Poet)) System. out. println ("不合法输入" );
Poet
po =( Poet )o ;
return this .Score > po. Score? 1:
( this. Score== po. Score? this. name. compareTo( po. name ):- 1) ;
}
}
//往HashSet和TreeSet中添加已经实现了hashCode,equals和comparaTo的对象。
//添加相同的对象
Set hs = new HashSet() ;
Set ts = new TreeSet() ;
Poet p1 =new Poet ("李清照" ,25 );
Poet p2 =new Poet ("李清照" ,25 );
Poet p3 =new Poet ("苏轼" ,25 );
Poet p4 =new Poet ("苏轼" ,24 );
Poet p5 =new Poet ("苏轼" ,23 );
//打印结果
/*[苏轼,
Score=25, 苏轼, Score=24, 苏轼, Score=23, 李清照, Score=25]
[苏轼,
Score=23, 苏轼, Score=24, 李清照, Score=25, 苏轼, Score=25]*//
HashSet和TreeSet都剔除了相同的元素,HashSet是调用hashCode和equals方法完成的,而TreeSet是调用对象的comparaTo的方法完成的。TreeSet按照得分的大小从小到大排序,而HashSet没有这样的自然比较顺序。
Set的取出元素
Set没有取出get();的方法,所以只能用该机for循环或者迭代器Iterato来获取元素。Iterator有三个方法,iterator()得到迭代器,hashnext()判断下一个元素是否存在,next()取出一个元素并将脚标往下移一位。
Iterator it =ts .iterator (); //获取迭代器
while (it .hasNext ()){ //判断下一个元素是否存在
Poet po =( Poet )it .next (); //取出下一个元素
System . out. println( po );
}