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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴扬 于 2012-7-5 00:17 编辑

System.out.println(a1);
System.out.println(a1.toString());
System.out.println(a1.hashCode());
这个a1是任意一个类对象实例,打印结果如下:
ClassA@c17164
ClassA@c17164
12677476
按理说a1是引用型变量,它的值是对象在内存中的地址值,打印的结果也应该是它的内存地址值的,为什么打印出来的结果和没有调用toString()方法相同呢?
还有一个问题就是hashCode()方法返回的哈希值到底是如何产生的?它具体有什么作呢?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

4 个回复

倒序浏览
咱们在打印的时候System.out.println(a1);这个和System.out.println(a1.toString());当然相同了,因为系统在打印这个的时候是默认调用toString()方法的,在API里对toString的解释是:返回该对象的字符串表示,如果你在打印的时候没有对toString();方法的复写,打印的结果就会一样,比如你这样改写,
public String toString() {
                return "name:" + name + ",age:" + age;
        }

那么你打印的结果就会不同,
至于第二个  ,按哥们的理解就是,每一个哈希值是一段数据的标签,而且是唯一性的,具体怎么用好像现在也没有学到,呵呵,希望可以帮到你,晚安
回复 使用道具 举报
你的第一个问题,直接使用System.out.println打印对象,JVM会自动调用该对象的toString方法,因此第一行和第二行的打印结果是相同的。c17164就是这个对象在内存的地址。
有了第一个问题的答案,我们再来看你的第二个问题。
Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。要想保证元素不重复,就要调用Object.equals方法进行比较。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。
JAVA中hash code原则上就是该对象的内存地址。 这样一来,当集合set要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上。如果有,在认为添加了重复元素则添加操作不会被执行。
你的第三行打印对象a1的hash code值显示是12677476这个十进制数,你把它转换为16进制就是c17164,既该实例的内存地址。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
向楼上的哥们学习,我在好好看看哈
回复 使用道具 举报
谢谢大家的解答!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马