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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© (づ ̄_3 ̄)づ 中级黑马   /  2014-10-23 13:30  /  1380 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我看视频上说是Object的toString返回的那串16进制数是对象的哈希码值,api帮助文档上也是这么说的。但我之前好像听一老师说是对象的内存地址,这两个是一回事么?每个对象的哈希码一定是唯一的?
还有“==”比较的是内存地址还是哈希码?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

6 个回复

倒序浏览
我记得内存地址就是用哈希码的吧
回复 使用道具 举报
Java给每个变量和实例分配内存空间
String s1=new String ("abc");
String s2=new String ("abc");
这个时候,s1和s2虽然赋值一样,但指向的内存地址是不一样的,因为他们是不同的对象。
-------------------------------------
如果没被重写,类继承的是Object的hashCode(),会给每个对象分配内存空间,通过重写hashCode()方法可以自己设定该类new出来的所有对象的哈希值,你创造出来的所有对象都指向同一个内存地址。比如
Person a=new Person();
Person b=new Person();
通过重写hashCode()方法后(a==b)返回true
这个时候就要通过equasl()方法来判断这两个对象指向内存空间存储的值是否相同。值相同a.equasl(b)返回true
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
  他们之间的比较,应用双等号(==),比较的是他们的值。
2.引用数据类型(对象)
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
回复 使用道具 举报
我认为是内存地址
回复 使用道具 举报
当对象被建立的时候,系统会在堆中给它开辟空间,并且分配一个首地址值,这个地址值呢是底层系统通过hashCode算法算来的。所以这个首地址值也被称为哈希值。
至于“==”在比较对象的时候是比较地址值得。而equals方法在Object中是比较地址值的,也就是运用了==的,不过后面的很多类都复写了equals是方法,使其比较的是对象中的内容,例如String类中的equals方法就是比较字符串对象内容的,它复写了object中的equals方法。说到这里,String类中每一个对象都有它的哈希值,如果你学到这一块就会很好理解了。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
Mr.Ni 发表于 2014-10-23 23:54
当对象被建立的时候,系统会在堆中给它开辟空间,并且分配一个首地址值,这个地址值呢是底层系统通过hashCo ...

不仅仅是String的每一个对象吧,好像大部分对象又有自己的hashCode方法
回复 使用道具 举报
Mr.Ni 中级黑马 2014-10-24 00:30:50
7#
我这里只是拿String类做个举例,至于hashCode方法,就我目前所学到HashSet中所讲到的,当需要某些判断条件时,可自定义其方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马