【问题标题】:use of hashCode() and equals() in TreeSet and TreeMap在 TreeSet 和 TreeMap 中使用 hashCode() 和 equals()
【发布时间】:2015-02-28 08:39:29
【问题描述】:

从下面的代码中,我了解到,TreeSet 和 TreeMap 不需要重写 equals() 和 hashCode() 方法,既不需要排序,也不需要搜索。

public class ComparableTest implements Comparable<ComparableTest> {

    private String username;

    public ComparableTest(String name) {
        this.username = name;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int compareTo(ComparableTest o) {
        return username.compareTo(o.getUsername());
    }

    @Override
    public String toString() {
        return this.getUsername();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        ArrayList<ComparableTest> comparableTestsList = new ArrayList<ComparableTest>();
        ArrayList<ComparableTest> comparableTestsList2;

        comparableTestsList.add(new ComparableTest("Second Name"));
        comparableTestsList.add(new ComparableTest("First name"));
        System.out.println("Orignal Array List  = " + comparableTestsList);

        // making a clone to test this list in Treeset
        comparableTestsList2 = (ArrayList<ComparableTest>) comparableTestsList
                .clone();
        // Sorting the first arraylist which works
        Collections.sort(comparableTestsList);
        System.out.println("Sorted Array List  = " + comparableTestsList);

        // searching the first array which does not work as equals method has
        // not been overriden
        int position = comparableTestsList.indexOf(new ComparableTest(
                "First name"));
        System.out.println("The position of First name is = " + position);

        //using the cloned collection in TreeSet
        TreeSet<ComparableTest> ts = new TreeSet<ComparableTest>(
                comparableTestsList2);
        System.out.println("The value in Tree Set is = " + ts);

        System.out.println("The position of First name is = " + ts.contains(new ComparableTest("First name")));//works fine

        //using the cloned collection in TreeMap
        TreeMap<ComparableTest, String> tMap = new TreeMap<>();
        for(ComparableTest ct: comparableTestsList2) {
            tMap.put(ct, "anushree");
        }       
        System.out.println("The value in Tree Map is = " + tMap);
        System.out.println(tMap.get(new ComparableTest("First name")));//works fine
    }
}

这与 javadoc http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html 中的内容完美匹配 TreeSet 实例使用其 compareTo(或 compare)方法执行所有元素比较,因此从集合的角度来看,此方法认为相等的两个元素是相等的。一个集合的行为是明确定义的,即使它的排序与equals不一致;它只是不遵守 Set 接口的一般约定。

还有写着: 注意,一个集合维护的顺序(无论是否提供显式比较器)必须与equals一致才能正确实现Set接口。

equals() 和 hashCode() 如何为 TreeSet 和 TreeMap 提供图片?我可以得到一个代码示例。谢谢!

【问题讨论】:

    标签: java treemap treeset


    【解决方案1】:

    你刚才说的:

    TreeSet 实例使用它的 compareTo(或 compare)方法执行所有元素比较

    equals()hashCode 在处理TreeSetTreeMap 时不会出现在画面中。但是,如果您将来将此对象用作HashMap(例如)的键,最好正确地覆盖它们。

    【讨论】:

    • 同意.. 我期待同样的答案
    【解决方案2】:

    同意您@Tunaki 的意见。 TreeSet 和 TreeMap 不需要 hashCode 和 equals 方法,因为排序取决于客户端提供的 compareTo 或 compare 方法。我认为这就是为什么 TreeMap 的这些 DS 的 containsKey 方法和 get(key) 方法都在 log(n) 时间而不是在 O(1) 时间运行的原因,因为它们不是基于哈希的数据结构,如 HashMap 或 HashTable通过在键上应用哈希函数,可以在 O(1) 时间内找到元素的位置。在 TreeSet 和 TreeMap 的情况下,应用二进制搜索来定位元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多