现正看到黑马毕向东HashSet,看着看着,有点懵,想问一问哈希值就是“地址”?如果不是,“地址”是什么?
如果我就是不想用HashSet存(就想用ArrayList存),算哈希值,还有什么用?

解决方案 »

  1.   

    如果定义一个类没有覆写toString方法的话,那么,打印该对象得到的是类名+@+hash码,下就是这个对象的地址
      

  2.   

    打印没有toString()方法的类调用的是继承自Object的 toString()方法.
      public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    HashSet内部实现是通过HashMap实现的,因此会有个hashcode跟被存储类的对应关系的样子,所以查找类的时候,计算hashcode后就能找到对应的类,因为hashcode可能会相同,可能会找到几个类.因此找到的可能是个链表,然后通过equels判定是不是要找的同一个类.因此hashset存储元素可能需要复写equels方法.没完全看懂HashMap的的实现.不过应该是那个意思吧.
      

  3.   

    不同对象的hashcode是可能相同的,叫做碰撞什么的,因此hashcode值绝不可能是地址.
      

  4.   

    一个类的equals和hashcode共同规定了实例的相等关系,equals返回true和hashcode相等就相当于实例相等。在类库内部有很多调用,比如集合框架中判断元素相等的部分
      

  5.   


    理解有误,并不是hashcode 和 equal 共同决定了对象的相等关系,决定对象的相等关系的只有 equal 方法.
    hashcode只是用来做一些快速判定的,很多equal的方法实现里会用hashcode做一个快速判断,如果hashcode不相等则说明对象不同,但是hashcode相等却不能证明对象相等,还要继续判定.
    hashcode另一个用处是用来做hashmap的键值哈希映射
      

  6.   

    哈希算法中,对象的内存地址不参与运算,所以有可能出现哈希值相同的情况,但是,两个相同的对象(引用同一处地址)的哈希值一定相同。equals方法中,比较的是两对象的属性是否相同。