java中Object类的HashCode方法

求解! 首先不明白的就是Object中hashCode方法的作用是什么? 书上介绍说这个散列码是对象的存储地址, 而且对象不同其所调用hashCode方法所得到的值应该是不同的。 我做了一个实验。自己创建了对象数组,让对象分别调用getName和hashCode方法,可是先后得到的结果却是不一样的。如下:Carl Cracker 28737396Harry Hacker 6927154Tony Tester 24355087-----------------------------Carl Cracker 6927154Harry Hacker 24355087Tony Tester 5442986还有就是在百&度&知&道上看到一个问题,我没搞明白。大虾就烦劳您给解释一下吧。多谢多谢!如下:String a = new String("i love you");String b = new String("i love you");我知道上面a与b的哈希值是一样。能不能由此判断a与b都是引用同一字符串对象。--------------------------------------------若b中的字符串值变为 b = "i hate you",同时a的字符串值保持为原值,即i love you。发现这时的a与b的哈希值是不一样。这时也能不能判断它们引用了两个不同的字符串对象。----------------------------------------------当 b = "i love you"且a不变时,发现 a与b的哈希值又一样了。能不能说b又引用了与a一样的对象。 总言之,能不能依靠String类中已覆盖过的hashCode()方法来判断字符串类型的引用变量(即如a或b那样的变量)是否指向同一个对象。这个被覆盖过的hashcode()方法所产生的哈希值能不能作为对象的一个唯一的标识号。 想再问一下:在String类中被覆盖过的hashCode()和Object类中的hashCode()方法有什么区别?作用是不是与Object类中的原方法一样呢?

hashcode 作用 实例的唯一标识
在同一运行环境下 hashcode 的值是唯一的 就是两个不同实例其hashcode在同一运行环境绝对不一样 主要用来区分 两个实例在物理上是不是同一个对象
string a = "111";
string b = "111";
a b 的hashcode是一样的 其原因是java的字符串池优化原因
你声明一个字符串时JVM会先去查找 字符串池 是否有相同字符串
有将已经有的字符串对象的引用返回 而不是新生成一个字符对象到内存
没有 新生成 并将起引用放入字符串池 如此循环
所以他们是同一个对象 其hashcode也一样
至于这个
String a = new String("i love you");
String b = new String("i love you");
如果hashcode也一样的话 那他们应该也是类似的优化。
jdk5 好像不一样吧?
从设计来说方法名一样其作用也要一样的 否则这个方法实现的就不是很理想
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-14
hashcode()是要在容器里面的MAP这个才能体现其价值,在MAP里面要是重写equals,就要重写
hashcode的方法,只要equals为真,那么hashcode也应该一样。平时其他的使用hashcode没什么大用。
第2个回答  推荐于2016-04-11
一、在Object类中的定义为:
public native int hashCode();
是一个本地方法,返回的对象的地址值。
但是,同样的思路,在String等封装类中对此方法进行了重写。方法调用得到一个计算公式得到的 int值。

二、在重写任何类得hashcode方法时必须遵循以下几点:
1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的Hashcode值可以相同,也有可能不同。
2、对于两个对象来说,如果他们的equals方法比较返回true,那么这两个对象的hashcode必然相同。这也解释了为什么String类中,如果两个对象的equals方法相同,则他们的hashcode值一定相同。
3、对于两个对象来说,如果使用equals方法返回为false,则他们的hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用判断equals方法了)
4、对于Object对象来说,不同的Object对象的hashcode是不同的,它们返回的是对象的地址,equals返回的也是对象的地址。所以在自己定义的类中如果要添加到集合对象中,最好是要重写hashcode和equals方法,不然会自动继承自Object类中的两个方法根据对象地址来判断。在重写自己定义的类时,通常是在类中的根据某个值如name.hashcode();来进行判断。

三、以HashSet 为例:
当我们使用HashSet时,hashCode()方法就会被得到调用,判断已经存储在集合中的对象的hashCode值是否与所增加。
对象的hashCode值一致,如果“不一致”则直接加进去(不用比较equals()提高效率),如果一致,则进行equals方法的比较,如果返回true,表明集合里面已经有这个对象,不能添加进去了。如果是false表是集合里面没有这个对象,则可以加进去。所以在重写hashcode()或者equals() 方法的任何一个方法时,必须重写另外一个。
示例代码:
/**
* People 手工重写hashcode方法和equals方法 根据name来判断 两个对象是否相等。
*/
class People {
private String name;
public People(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
//如果是自己
if(this==obj){
return true ;
}
//如果是空
if(obj==null ){
return false;
}
//比较两个People的名字是否相同
if(obj!=null && obj instanceof People){
if(((People)obj).name.equals(this.name))
return true ;
}
return false;
}
@Override
public int hashCode() {
// String的hashcode本来就是用来比较两个字符是否相等
return name.hashCode();
}
}本回答被网友采纳
第3个回答  2012-02-17
同意楼上说法