10

如果一个对象拥有一个唯一的主键,它需要实现哪些接口才能对集合友好,特别是在高效排序、可散列等方面……?

如果主键是字符串,这些接口如何最好地实现?

谢谢!

4

4 回答 4

13

您必须覆盖Object.equals()and Object.hashCode(),并且还要实现该Comparable接口。这将使您的类在进行任何类型的排序或散列时完全“兼容”,包括使用Collections.sort()、任何Map类或任何Set类。如果该类被放入某种集合中的可能性很小,那么它肯定应该实现所有这三个方法。

public class A implements Comparable<A>{
    private String key;

    @Override
    public boolean equals(Object obj){
        if (this == obj) return true;
        if (!(obj instanceof A)) return false;

        A that = (A)obj;
        return this.key.equals(that.key);    
    }

    @Override
    public int hashCode(){
        return key.hashCode();
    }

    @Override
    public int compareTo(A that){
        //returns -1 if "this" object is less than "that" object
        //returns 0 if they are equal
        //returns 1 if "this" object is greater than "that" object
        return this.key.compareTo(that.key);
    }
}

请记住,如果两个对象相等,则:

  1. 它们的哈希码也必须相等并且
  2. compareTo()必须返回 0。
于 2010-06-03T00:06:15.333 回答
12

您必须实现equalshashCode和(在实现Comparable接口之后)compareTo

在每种情况下,由于您有一个作为主键的字符串,您可以考虑简单地将这些调用分派给您的字符串。例如:

public class Friendly implements Comparable<Friendly>
{
    // presumably you've got other fields as well
    private String primaryKey;
    public Friendly(String primaryKey)
    {
        this.primaryKey = primaryKey;
    }

    public int compareTo(Friendly other)
    {
        return primaryKey.compareTo(other.primaryKey);
    }

    public int hashCode()
    {
        return primaryKey.hashCode();
    }

    public boolean equals(Object o)
    {
        return (o instanceof Friendly) && primaryKey.equals(((Friendly)o).primaryKey);
    }
}
于 2010-06-02T23:48:06.217 回答
5

字符串已经非常适合散列和比较,因此如果您的对象可以真正由字符串唯一标识,那么您的状态就很好。只需确保实现Comparable用于排序和覆盖的接口equals以及hashCode(委托给主键字符串)用于散列,你就可以开始了。

于 2010-06-02T23:49:48.467 回答
3

如果主键是 anObject您需要确定排序顺序是基于Object还是Object的主键Object

在任何一种情况下,要排序的项目都应该Comparable使用适当的compareTo()方法实现接口。赔率非常好,这意味着您也必须覆盖equals()hashCode()因为只有一些主键对象可能具有适当的默认实现。

如果要根据一些非自然排序顺序进行排序,那么还要实现一些“额外” Comparators。订购Collections支持替代品Comparators

于 2010-06-02T23:51:07.393 回答