eag*_*arn 6 java equals hashcode comparable
我发现这个注释可以将StringBuffer对象作为Java中TreeSet中的键吗?
"在Java中使用地图有两种识别策略(或多或少).
散列:输入"Foo"被转换为尽可能最好的尝试,以生成唯一访问数组索引的数字.(纯粹主义者,请不要虐待我,我故意简化).此索引是存储值的位置."Foo"和"Bar"实际上可能生成相同的索引值,这意味着它们都将映射到相同的数组位置.显然这不起作用,所以这就是"equals()"方法的用武之地; 它用于消除歧义
比较:通过使用比较方法,您不需要这个额外的消歧步骤,因为比较首先不会产生这种碰撞."Foo"等于的唯一关键是"Foo".一个非常好的想法是,如果你可以将"equals()"定义为compareTo()== 0; 为了一致的缘故.不是要求."
我的问题如下:如果我的类实现了可比性,那么它是否意味着我不必重写equals和hashcode方法来将我的对象用作Hash集合中的键.例如
class Person implements Comparable<Person> {
int id;
String name;
public Person(int id, String name) {
this.id=id;
this.name=name;
}
public int compareTo(Person other) {
return this.id-other.id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以在Hashable集合中使用我的Person对象吗?
你正在讨论的文章TreeSet.树集是一棵树,每个节点都有一个由其值定义的位置,与树中已有的其他值相比较.
一个hashTable在哈希表中存储的键/值对.使用Hashtable时,您可以指定用作键的对象,以及要链接到该键的值.然后对密钥进行散列,并将得到的散列代码用作值存储在表中的索引.
之间的差别Hashable,并TreeSet是TreeSet中并不需要hashCode,它只是需要知道,如果你需要的项目向左或向右在树中服用.为此你可以使用比较而已.
在hashTable中,比较就足够了,因为它的构建方式不同,每个对象通过对其进行散列来到达他的单元格,而不是通过将其与集合中已有的项目进行比较.
所以答案是否定的,你可以' Person在哈希表中使用compareTo.你必须覆盖hashCode()并equals()为此
我还建议你阅读关于哈希表的这篇文章