A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wjj410830911 中级黑马   /  2013-11-20 05:44  /  1319 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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
有些不明白。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

3 个回复

倒序浏览
Java中两个对象的比较,首先比较哈希值,如果哈希值不相同直接返回false,哈希值相同再用equals方法进行比较,相同返回true,不相同返回false。所以 一般要进行对象比较的类都会 重写hashCode方法和equals方法。哈希值是通过哈希算法得到的,不同的对象的哈希值是有可能相同的,但是哈希值不同的对象一定不是同一个对象。调用equals方法返回值相同的一定是同一个对象

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
要明确几点
(1)String 值是存储在常量池内的
(2)String类覆写了HashCode()方法(计算HashCode关联String内容,也就是说,内容如果一样,那么HashCode值也必定一样,如果没覆写则HashCode值等于地址值)
(3)String类覆写了也覆写了equals()方法,比较的内容,如果没覆写,比较的是内存地址
(4)str1.equals(str2) 比较的是内容
(5)str1==str2 比较的是两个对象的内存地址值,因为你i通过new关键字创建的两个对象,那么必定会为每个对象在堆内存中单独开辟空间,无论这两个对象的内容否相等,所以地址值必定不相同

评分

参与人数 1黑马币 +1 收起 理由
Cway㊣ + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马