如果一个对象拥有一个唯一的主键,那么它需要实现哪些接口才能实现集合友好,特别是在高效排序,可清洗等方面......?
如果主键是字符串,那么如何最好地实现这些接口?
谢谢!
答案 0 :(得分:12)
您必须实施equals,hashCode和(在实施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);
}
}
答案 1 :(得分:11)
您必须覆盖Object.equals()
和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);
}
}
请记住,如果两个对象相等,那么:
compareTo()
必须返回0。答案 2 :(得分:5)
字符串已经非常适合散列和比较,因此如果您的对象可以通过字符串真正唯一标识,那么您就可以处于良好状态。只需确保实现Comparable
接口以进行排序并覆盖equals
和hashCode
(委托给主键字符串)进行散列,您就可以了。
答案 3 :(得分:3)
如果主键是Object
,您需要确定排序顺序是基于Object
还是Object
的主键Object
。
在任何一种情况下,要排序的项都应该使用正确的Comparable
方法实现compareTo()
接口。赔率非常高,这意味着您还必须覆盖equals()
和hashCode()
,因为只有部分主键对象可能具有正确的默认实现。
如果您想根据某些非自然排序顺序进行排序,那么还要实现一些“额外”Comparators
。已订购的Collections
支持替代Comparators
。