Java TreeSet和HashSet是否应该使用相同的数据给出不同的结果?

时间:2014-01-30 22:17:12

标签: java hashset treeset

以下程序打印 一|二 一|二 当使用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;
    }

}

}

2 个答案:

答案 0 :(得分:4)

HashSet类将使用hashCodeequals来确定集合中是否已存在重复项。 TreeSet类将使用Comparable(或者Comparator)来订购商品并确定是否存在重复。

BkComparable<Bk>,因此TreeSet可以正常使用它。但是,您仍然需要覆盖hashCodeequals,以便HashSet也能正常使用它。

答案 1 :(得分:2)

如果你想要一个HashSet的一致行为,你必须按照Javadoc实现hashCode()和equals(),并且这样可以与compareTo()方法保持一致。