黑马程序员技术交流社区

标题: 关于hashCode和内存地址的关系? [打印本页]

作者: 王薪婷    时间: 2013-3-25 19:41
标题: 关于hashCode和内存地址的关系?
本帖最后由 王薪婷 于 2013-3-26 10:09 编辑

hashCode和对象的内存地址有什么关系?特别是String str=“adm”和String str1=new String(“adm”);str和str1分别是存在那里的呢?我确定他们的hashCode是一样的,但是他们的内存地址是一样的吗?

作者: 李尧    时间: 2013-3-25 19:47
不一样.new String("adm")这种构造方法:
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法,除非需要 "adm" 的显式副本。 这点API里有说明.
也就是说"adm"和new String("adm")是两个对象,内存空间不一样.
hashCode()相同不代表内存地址一定相同.这一点网上有详细论述,我就不粘贴复制了....
作者: 王薪婷    时间: 2013-3-25 19:55
李尧 发表于 2013-3-25 19:47
不一样.new String("adm")这种构造方法:
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序 ...

恩呢我也是觉得内存应该不一样,也参考了API,谢谢~那个类名+@+hashCode这个是数组和对象的地址值,那如果要打印出String类对象的地址值会和这个一样吗?
作者: 李尧    时间: 2013-3-25 20:04
王薪婷 发表于 2013-3-25 19:55
恩呢我也是觉得内存应该不一样,也参考了API,谢谢~那个类名+@+hashCode这个是数组和对象的地址值,那如 ...

这个我真说不清了,我只知道哈希码不能单纯的理解为内存地址.我也菜鸟一枚,给你个博客链接,你可以参考一下,这个说得很详细http://blog.sina.com.cn/s/blog_a01ab79d0101bal3.html
作者: 李尧    时间: 2013-3-25 20:05
王薪婷 发表于 2013-3-25 19:55
恩呢我也是觉得内存应该不一样,也参考了API,谢谢~那个类名+@+hashCode这个是数组和对象的地址值,那如 ...

还有这三点 是百度百科给出的
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
作者: 王薪婷    时间: 2013-3-25 20:22
李尧 发表于 2013-3-25 20:04
这个我真说不清了,我只知道哈希码不能单纯的理解为内存地址.我也菜鸟一枚,给你个博客链接,你可以参考一下 ...

恩恩谢谢你!
作者: 王龙涛    时间: 2013-3-25 20:59
(1)
        String str=“adm”  
       一个对象,在常量池中创建一个"adm"的字符串对象。
(2)
        String str1=new String(“adm”)   
       两个对象,创建了两个对象,一个对象存在于常量池中,一个对象存在于堆内存中。
       原理是,当创建“adm”时,先检查常量池中是否存在这个字符串,
       如果没有,则创建一个新的“adm”字符串对象;
       之后再在堆内存中new一个对象,并将地址值赋给str1。
(3)
      str和str1的hashCode值不一样。很明显str1有两个对象,不确定地址。
作者: 王薪婷    时间: 2013-3-26 10:11
王龙涛 发表于 2013-3-25 20:59
(1)
        String str=“adm”  
       一个对象,在常量池中创建一个"adm"的字符串对象。

恩呢谢谢,很有帮助,我现在也不纠结那个地址到底在哪里了~




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