黑马程序员技术交流社区

标题: 内存地址和hashcode有什么关联 [打印本页]

作者: chenwei    时间: 2012-4-22 21:10
标题: 内存地址和hashcode有什么关联
int [] a1= new int[1];
System.out.println(a1);
打印的是[I@af993e
有的老师说是hashcode值
有的老师说是内存地址
有什么关系吗
作者: 陈苓    时间: 2012-4-22 21:16
就是数组创建之后在内存中开辟的空间。这块空间的地址就是通过哈希值算得出来的,System.out.println(a1);这是打印内存的地址值,地址是用哈希值表示的,所以你打印出来的就是哈希值。
作者: prospect    时间: 2012-4-23 01:33
内存地址是用十六进制的哈希值表示的。哈希值只是对内存地址的一种表现形式。就好比一个取了一个名字,不过这里内存地址的人名是用十六进制表示的哈希值。
作者: 邱俊杰    时间: 2012-4-23 01:44
对象一定有内存地址,所以一定有哈希值,因为哈希值是根据地址生成的整数;

Object 的hashCode方法里面就一句返回语句  是 return 类名的 +@+对象内存地址值 , 所以肯定和内存地址值有关系的,这个版主说过。- -
作者: 袁培育    时间: 2012-4-23 09:02
如果你没有自定义hashcode方法的话,那么内存地址就是windows自己用hash算法算出来的hash值并被java虚拟机调用的
作者: 王勃    时间: 2012-4-23 10:31
本帖最后由 王明(1988) 于 2012-4-23 11:08 编辑

嗯 不错的问题!让传说哥给你一个清晰的答案。
第一:你所打印的数组引用(或者对象引用)的结果都是一串字符这串字符其实是对象的toString()方法的返回值,java中是这样定的(比如类实例化的对象):类名(包含包)+@+内存地址
         而这个内存地址是根据哈希算法计算出来的十六进制值,在java中表示内存地址,哈希值只是对内存地址的一种表现形式,因为哈希值会出现重复。
         
果断上代码上图:
  1. package com.heima;

  2. public class HashCodeTest {
  3.         public static void main(String[] args) {
  4.                 HashCodeTest h = new HashCodeTest();
  5.                 System.out.println(h);
  6.         }

  7. }
复制代码
输出结果:
  


  
注意: 哈希码(hashcode)并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
          Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以hashcode可以做到尽可能的不一样,但我们要清楚一点,既然是用到hash技术,就是要解决冲突的,
          所以hashcode是会出现相同的时候,我们可以将hashCode相同的看成放入同一个桶中。
第二:用例子证明hashcode会出现重复的可能。(说明美国的大神也并非算法天衣无缝)
       果断上图上代码:
  1. package com.heima;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class HashCodeTest2 {
  5.         
  6.         public static void main(String[] args) {
  7.                 //用List根据hashcode的不同,来装对象
  8.                 List<Integer> list = new ArrayList<Integer>();
  9.                 //装8000个,看看是否hashcode有重复的。。。
  10.                 for (int i = 0; i < 8000; i++) {
  11.                         HashCodeTest2 h = new HashCodeTest2();
  12.                         if (!list.contains(h.hashCode()))
  13.                                 list.add(h.hashCode());
  14.                 }
  15.                 System.out.println("list中的hashcode个数为:"+list.size());
  16.         }
  17. }
复制代码
输出结果:

   我原想他会装8000个,但是少了2个hashcode值,这不说明了在8000个中有两个hashcode被重复了吗!。其实内存地址是不会重的。
   打印的引用只是hashcode值,他可能冲突。

作者: 王勃    时间: 2012-4-23 10:40
怎么才能上大图呢,总是被缩小,郁闷中。。。。
作者: 伊文龙    时间: 2012-4-23 11:35
王明(1988) 发表于 2012-4-23 10:40
怎么才能上大图呢,总是被缩小,郁闷中。。。。

哈哈,小图浏览的时候一点就大了。郁闷啥。
作者: 王勃    时间: 2012-4-23 12:11
嗯,我想不用单击,图片就很清晰,一直都是这样,郁闷的很啊,看来戴志康这两天不好好干了。。。。




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