您的位置:首页 > 编程语言 > Java开发

JAVA中的== equals hashcode问题

2011-10-22 15:26 302 查看
JAVA中的== equals hashcode问题

1. '=='是用来比较两个变量(基本类型和对象类型)的值是否相等的, 如果两个变量是基本类型的,那很容易,直接比较值就可以了。如果两个变量是对象类型的,那么它还是比较值,只是它比较的是这两个对象在栈中的引用(即地址)。

对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。

2. Object类中的equals方法就是用'=='来比较的,所以如果没有重写equals方法,equals和==是等价的。

通常我们会重写equals方法,让equals比较两个对象的内容,而不是比较对象的引用(地址)因为往往我们觉得比较对象的内容是否相同比比较对象的引用(地址)更有意义。

3. Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看)。所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。通常在集合类的时候需要重写hashCode方法和equals方法,因为如果需要给集合类(比如:HashSet)添加对象,那么在添加之前需要查看给集合里是否已经有了该对象,比较好的方式就是用hashCode

4. 注意的是String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法,这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码),所以只要对象的基本类型值相同,那么hashcode就一定相同。

5. equals()相等的两个对象,hashcode()一般是相等的,最好在重写equals()方法时,重写hashcode()方法; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),而object类中的equals()方法比较的也是两个对象的引用(地址值),如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了。

以下是测试代码。

《Effective Java》中也提到重写equal方法,规范性地也需要重写hashCode()。

重写该方法,影响m1.equals(m2)

public boolean equals(Object o){

return true;

}

重写该方法,影响m1.hashCode()和m2.hashCode()的输出

public int hashCode(){

return 111;

}

另外,当hashCode不等的时候,向HashMap中存放值

Map map = new HashMap();

map.put(m1, m1);

map.put(m2, m2);

System.out.println(map.size());

System.out.println(map.containsKey(m1));

System.out.println(map.containsKey(m2));

会放入2个,就算equals是true

如果hashCode相等,会存放入1个:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: