以下程序打印 一|二 一|二 当使用HashSet时。如果我将其更改为TreeSet,则仅打印 一个| 2
不期望用同一组数据给出相同的结果吗?我在这里做错了什么?在TreeSet的情况下,程序中的内容使第二条记录重复?
import java.util.HashSet; import java.util.Set;
public class SetTest {
public static void main(String arg[]) {
Set<Bk> bookList = new HashSet<Bk>();
//Set<Bk> bookList = new TreeSet<Bk>();
bookList.add(new Bk("one","two"));
bookList.add(new Bk("one","two"));
for(Bk book: bookList){
System.out.println(book);
}
}
}
class Bk implements Comparable<Bk> {
public String name;
public String author;
public String toString(){
return name+"|"+ author;
}
Bk(String name, String author) {
this.name = name;
this.author = author;
}
@Override
public int compareTo(Bk that) {
int author = this.author.compareTo(that.author);
int name = 0;
if (author == 0) {
name = this.name.compareTo(that.name);
return name;
} else {
return author;
}
}
}
答案 0 :(得分:4)
HashSet
类将使用hashCode
和equals
来确定集合中是否已存在重复项。 TreeSet
类将使用Comparable
(或者Comparator
)来订购商品并确定是否存在重复。
您Bk
为Comparable<Bk>
,因此TreeSet
可以正常使用它。但是,您仍然需要覆盖hashCode
和equals
,以便HashSet
也能正常使用它。
答案 1 :(得分:2)
如果你想要一个HashSet的一致行为,你必须按照Javadoc实现hashCode()和equals(),并且这样可以与compareTo()方法保持一致。