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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘海陆 中级黑马   /  2013-3-18 08:48  /  6402 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小马过河 于 2013-3-18 09:45 编辑

看毕老师的视频,在打印数组名的时候,打印出来的哈希值很像数组明,问一下,哈希值是不是数组呢?:handshake

8 个回复

倒序浏览
      哈希值不是内存地址     
        
HASH 是散列表的基础计算方法,Java 内置了 hash 的支持,java.lang.Object 默认是通过对象在内存的地址计算出来的,所以每个对方都是唯一的 hash,但是当我们创建我们自己的对象类时,我们根据需要和业务逻辑来决定是否提供自己的 hashcode 和 equals 方法。

       多个对象的 hash 可能重复,这是正常的,重复的对象在 hash table 中是分配在同一个槽 (一个可以通过计算直接跳过那个位置的数组)中,会再通过 equals 对比 (在这个槽中的 hash code 都相同的一个链表中逐一 equals 比较 key) 找到那个对象。所以逻辑上是否相同是通过 equals 来计算的,而且 equals 相同的两个对象,它们的 hash 也应该相同,如果你不能保证这点,那就说明你的 hashcode 和 equals 方法不是使用相同的算法。

       一个对象是否存在不是通过 hash code 来判断的,而是 equals。a == b 的话,a.equals (b) 肯定成立,但反过来就不一定。因为 a == b 比较的是对象的地址,只有同一个对象才能成立,equals 比较的是逻辑角度上的相等性。
回复 使用道具 举报
哈希值不是地址,而是根据地址来计算出来的,这是Object类的计算方法,但如果我们不想用原来的计算方法,则完全可以重写hashCode方法,哈希值是一个值,怎么能是一个数组呢,这个不明白为啥你有这个疑问
回复 使用道具 举报
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
  消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。
  小红和小明可按下面的方式使用哈希函数以确保数据完整性。如果小红对小明编写一条消息并创建该消息的哈希,则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同,则该消息没有被更改;但是,如果值不相同,则该消息在小红编写它之后已被更改。为了使此系统运行,小红必须对除小明外的所有人保密原始的哈希值。
回复 使用道具 举报
哈希值不是内存地址,而是根据内存地址算出来的,而且我们自己也可以定义哈希值的算法,只是用来比较的参数而已。
回复 使用道具 举报
肖路宽 发表于 2013-3-18 09:34
哈希值不是地址,而是根据地址来计算出来的,这是Object类的计算方法,但如果我们不想用原来的计算方法,则 ...

数组在new的时候不是在内存开辟空间吗,我以为打印数组名时候,打印的是内存地址  [I@14318bb
回复 使用道具 举报
    首先说,hash值不是内存地址值,而是根据hashCode值计算出来的,其实你自己可以验证一下啊。代码如下:

         public static void main(String[] args) {
                int[] arr = new int[5];//以数组为例,看一下数组的hashCode值和对象引用是不是同一个
                int hashCode = arr.hashCode();//获取数组arr的hashCode值
                System.out.println(hashCode);//打印出arr的hashCode值
                System.out.println(arr);//打印出对象的对象引用值        
         }
    运行结果:31843011
                   [I@1e5e2c3
    很容易知道不是同一个值吧,hash值是一串数字,从hashCode方法返回值就可以看出。而对象引用值是一个非纯数字的字符串,一般带有对象的特点,比如数组对象引用值中的"["代表一位数组。
回复 使用道具 举报
黑马-雷钊 来自手机 中级黑马 2013-3-18 17:05:12
8#
你好!简单来说。内存地址是用哈希值表示的,就像你的名字是用中文表示样的。但中文并不是你的名字,还可以代表很多其它事物。希望你能看懂
回复 使用道具 举报
看毕老师的视频老是提到hash值和对象或者变量内存地址。首先类都是继承object,产生的实例对象都可以通过超类object的toString得到一个字符串(类型+@+值),可以通过object类里面的hashcode获得该对象的hash值并且调用Integer.toHexString转化成16进制的值这个值会等于上面@后面的值,说明toString返回的字符串由对象类名+@+对象0x哈希值;还有直接打印某个数组对象名时得到的也是一个字符串由表示数组类型的字符(比如'['表示一元数组)+@+对象0x哈希值。问题:这两个字符串是不是对应对象所在的内存地址啊?(我个人认为内存地址应该是一个0x数据所以不是内存地址)如果不是要怎么获取对象或者变量的内存地址?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马