0,如题
1,查找的时候是根据hashcode()是吗2,
2。1是不是一定要定义hashcode()?
2。2哪些要定义呢?
3,能给一个具体的Demo,演示该程序如何根据hashcode()运作的呢?
4,谢谢
以上
1,查找的时候是根据hashcode()是吗2,
2。1是不是一定要定义hashcode()?
2。2哪些要定义呢?
3,能给一个具体的Demo,演示该程序如何根据hashcode()运作的呢?
4,谢谢
以上
他唯一标识一个对象,只不过在java里 hashcode仅仅用来唯一标识一个对象,你不能真当他地址和指针用(虽说这是废话……)所以java里的每个对象都是实现了hashcode方法的,所以,object类就已经实现了hashcode方法
并且 某个对象一旦被创建,这个hashcode就已经生成了的
所以hashcode并不是像他的名字看起来那样仅仅为hashmap等类服务的
hashmap正是根据hashcode这一 对象唯一标识符 来存放对象,所以你可以正确的引用先前存放的对象,并且理论上你永远也不会取错一个对象,除非你将该对象释放了你可以比较hashmap的c++ 或者object pascal版本,他们正是使用指针来存放对象的
hashcode机制确保了每个对象都有一个唯一的标识,所以无论什么时候你都能保证你引用了一个正确的对象而不是他的一个副本或别的什么,从而导致混乱以上纯属个人见解 有错误的地方请不吝指正 非常感谢
只知道对象比较就是比较的hashcode
对,默认情况下,查找确实是根据hashcode()来进行查找的,这样速度也是很快的。
2
2。1 一个类会从父类(或object类)继承hashcode(),没有什么特殊的目的无需覆盖hashcode()方法。
2。2 在进行比较时两个对象的hashcode相同的话,obj1==obj2为true,所以如果你覆盖hashcode方法,让他依你的规则生成hashcode的话,你就可以定义你自己的比较规则了。但最好不要去覆盖它。
3 你可以看看hashset或hashmap的源码,比较复杂,要仔细看。
4 不谢!
以上看法,有不同意见的欢迎讨论。
如:我们定义一个类A,不覆写hashCode()和equals(),当我们用它当HashMap的key时,以后对它时行查找会找不到。
import java.util.*;
class A{
int num;
A(int num){this.num = num;}
}
public class Test{
public static void main(String[] args){
HashMap hm = new HashMap();
for(int i=0; i<5; i++)
hm.put(new A(i), "Test");
A a = new A(3);
if(hm.containsKey(a))
System.out.println(hm.get(a));
else
System.out.println("Key Not Found");
}
}
结果是"Key Not Found"。我们改动一下class A,正确的结果就出来了:
class A{
int num;
A(int num){this.num = num;}
public int hashCode(){return this.num;}
public boolean equals(Object o){
return (o instanceof A) && (this.num==((A)o).num);
}
}当然,这个hashCode()只是最简单的实现,只是为了让你更容易明白,实际上会更复杂一点。
他唯一标识一个对象,只不过在java里 hashcode仅仅用来唯一标识一个对象,你不能真当他地址和指针用(虽说这是废话……)------------------------------------------------------------------------------
hashCode用于快速排序,并不一定唯一标志对象,不同对象的hashCode可以重复。
但hashCode()和equals()两个方法合起来一定要能唯一标志对象。