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 好像不一样吧?
从设计来说方法名一样其作用也要一样的 否则这个方法实现的就不是很理想
hashcode()是要在容器里面的MAP这个才能体现其价值,在MAP里面要是重写equals,就要重写
hashcode的方法,只要equals为真,那么hashcode也应该一样。平时其他的使用hashcode没什么大用。
一、在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();
}
}
同意楼上说法