黑马程序员技术交流社区

标题: hasnCode的问题 [打印本页]

作者: wjj410830911    时间: 2013-11-20 05:44
标题: hasnCode的问题
本帖最后由 wjj410830911 于 2013-11-20 13:04 编辑

public class A {
    public static void main(String[] args){
           String str1 = new String("qqqq");
           String str2 = new String("qqqq");
           System.out.println("str1 hashcode = "+str1.hashCode());
           System.out.println("str2 hashcode = "+str2.hashCode());
           System.out.println("str1.equals(str2) = "+str1.equals(str2));
           System.out.println("str1==str2 = "+(str1==str2));

    }
}

输出结果为:
hashcode str1 :  3478592
hashcode str2 :  3478592
str1.equals(str2) : true
str1==str2 : false


请问为什么new出得两个对象hashcode会相等?还有为什么hashcode相等了str1==str2 还输出false
有些不明白。
作者: 何丛    时间: 2013-11-20 07:20
Java中两个对象的比较,首先比较哈希值,如果哈希值不相同直接返回false,哈希值相同再用equals方法进行比较,相同返回true,不相同返回false。所以 一般要进行对象比较的类都会 重写hashCode方法和equals方法。哈希值是通过哈希算法得到的,不同的对象的哈希值是有可能相同的,但是哈希值不同的对象一定不是同一个对象。调用equals方法返回值相同的一定是同一个对象
作者: 应用控老童鞋    时间: 2013-11-20 09:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: Jim-剣◆﹏    时间: 2013-11-20 09:52
要明确几点
(1)String 值是存储在常量池内的
(2)String类覆写了HashCode()方法(计算HashCode关联String内容,也就是说,内容如果一样,那么HashCode值也必定一样,如果没覆写则HashCode值等于地址值)
(3)String类覆写了也覆写了equals()方法,比较的内容,如果没覆写,比较的是内存地址
(4)str1.equals(str2) 比较的是内容
(5)str1==str2 比较的是两个对象的内存地址值,因为你i通过new关键字创建的两个对象,那么必定会为每个对象在堆内存中单独开辟空间,无论这两个对象的内容否相等,所以地址值必定不相同




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2