public class Hash { public static void main(String[] args) { C x = new C(); C y = new C(); System.out.println(x.hashCode()); System.out.println(y.hashCode()); } } class C{} 同一类型对象的hashcode是不一样的/////
首先你要明确跟别人讨论问题的范围,你说的是hash吗,还是java中的hashcode方法? 如果单纯说hash的话,是一种数据结构,跟地址没什么关系,看你的hash函数怎么定义的。4楼的例子很好。 如果说的是java中的hashcode()方法,那也要看具体实现。Object的实现是对地址进行处理得到的,比如13楼的例子,这时候是跟地址有关的。但是你看看别的类呢,比如String类、Integer类,它们都有自己计算hashcode的方式,就跟地址没有关系了。 public class Test { public static void main(String[] args) { Integer int1 = 5; Integer int2 = 6; System.out.println(int1.hashCode()); System.out.println(int2.hashCode()); String str1 = "Hello"; String str2 = "World"; System.out.println(str1.hashCode()); System.out.println(str2.hashCode()); } } 所以,不要认为hashcode就是和地址相关的。
"同一个类生成的对象哈希码必不一样", 从规则上说应该是这样的,关键还是看hashcode函数是如何计算hash码的,如果设计的不好,冲突现象是难免的,也就不能说“同一个类生成的对象哈希码必不一样”。 举一个极端的例子: public class Test { @Override public int hashCode() { return 5; } public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); System.out.println(t1.hashCode()); System.out.println(t2.hashCode()); } } Test类的所有对象hashcode都是一样的。
不过不是绝对,要看你的hash算法好不好了,目前比较好的hash算法可以达到上亿分之一才有可能不同对象重复同一个HashCode数据结构里说过了,这是避免不了的
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
public static void main(String[] args) {
C x = new C();
C y = new C();
System.out.println(x.hashCode());
System.out.println(y.hashCode());
}
}
class C{}
同一类型对象的hashcode是不一样的/////
hashCode的计算方式越复杂,冲突的可能性越小。
13楼的例子,明确的。
equals相同
但哈希码不一样。
如果单纯说hash的话,是一种数据结构,跟地址没什么关系,看你的hash函数怎么定义的。4楼的例子很好。
如果说的是java中的hashcode()方法,那也要看具体实现。Object的实现是对地址进行处理得到的,比如13楼的例子,这时候是跟地址有关的。但是你看看别的类呢,比如String类、Integer类,它们都有自己计算hashcode的方式,就跟地址没有关系了。
public class Test { public static void main(String[] args) {
Integer int1 = 5;
Integer int2 = 6;
System.out.println(int1.hashCode());
System.out.println(int2.hashCode());
String str1 = "Hello";
String str2 = "World";
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
}
所以,不要认为hashcode就是和地址相关的。
举一个极端的例子:
public class Test { @Override
public int hashCode() {
return 5;
} public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
}
}
Test类的所有对象hashcode都是一样的。
所以:
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。