我有一个有文章列表(或你想要的)的类。如下所示,实现/覆盖该类中的hashCode()
函数是否安全:
class Place{
List <Article> list = new List<Article>();
public int hashCode() {
if(list.isEmpty())
return 0; //is it safe to return 0
else
return list.get(0).hashCode();
}
}
public class Main{
private HashSet<Place> places = new HashSet<>();
//this function must be donne like this
public boolean isArticleIn(Article article){
Place place = new Place();
place.add(article);
return places.contains(place);
}
}
是否有可能有一个非空的列表并返回0。
答案 0 :(得分:3)
如果要将类的对象存储在使用hashCode的容器中,则应确保"if two objects are equal then they should return the same hash code"(否则容器可能存储重复项/通常会混淆)。如果它们都有一个空列表,那么你的类的对象会比较相等吗?
关于如何实现equals和hashcode以便在保持一致性的同时捕获所需信息的最佳建议是available here(使用推荐的Apache Commons Lang库中的EqualsBuilder和HashCodeBuilder)。列表中的所有元素似乎都应该对哈希码做出贡献 - 毕竟,如果列表的第二个或第三个元素不同,那么您的对象将从等于&#39;等于&#39; - 对吗?
答案 1 :(得分:1)
很安全。这是不可改变的,这很好。
然而您的散列集合将不具备高效性,因为您不提供均匀分布的散列码范围,因此您的散列填充不会均匀分布。请参阅here for an explanation of what's going on inside a hashed collection。