黑马程序员技术交流社区

标题: 关于toString和equals [打印本页]

作者: (づ ̄_3 ̄)づ    时间: 2014-10-23 13:30
标题: 关于toString和equals
我看视频上说是Object的toString返回的那串16进制数是对象的哈希码值,api帮助文档上也是这么说的。但我之前好像听一老师说是对象的内存地址,这两个是一回事么?每个对象的哈希码一定是唯一的?
还有“==”比较的是内存地址还是哈希码?
作者: Dream.    时间: 2014-10-23 14:10
我记得内存地址就是用哈希码的吧
作者: my1111wxy    时间: 2014-10-23 16:24
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。
作者: chen578157939    时间: 2014-10-23 18:59
我认为是内存地址
作者: Mr.Ni    时间: 2014-10-23 23:54
当对象被建立的时候,系统会在堆中给它开辟空间,并且分配一个首地址值,这个地址值呢是底层系统通过hashCode算法算来的。所以这个首地址值也被称为哈希值。
至于“==”在比较对象的时候是比较地址值得。而equals方法在Object中是比较地址值的,也就是运用了==的,不过后面的很多类都复写了equals是方法,使其比较的是对象中的内容,例如String类中的equals方法就是比较字符串对象内容的,它复写了object中的equals方法。说到这里,String类中每一个对象都有它的哈希值,如果你学到这一块就会很好理解了。
作者: 贾浩田    时间: 2014-10-24 00:21
Mr.Ni 发表于 2014-10-23 23:54
当对象被建立的时候,系统会在堆中给它开辟空间,并且分配一个首地址值,这个地址值呢是底层系统通过hashCo ...

不仅仅是String的每一个对象吧,好像大部分对象又有自己的hashCode方法
作者: Mr.Ni    时间: 2014-10-24 00:30
我这里只是拿String类做个举例,至于hashCode方法,就我目前所学到HashSet中所讲到的,当需要某些判断条件时,可自定义其方法。




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