10000个对象放入hashtable,hashcode不同?为什么?

10000个对象放入hashtable,hashcode不同?为什么?

  1. 如果要一样的会出现什么问题呢?
    答: 如果一个collection,比如hashmap中存储了一千个对象,那么如何判断互相之间不相等呢,如果一个一个比较那么得比较 1000!次,所以根据获取hash的方式来指定一个不会重复的值。

  2. hash值怎么得来。
    答:是通过hash算法,也就是散列算法。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。可以这样简单理解,[color=red]hashCode方法实际上返回的就是对象存储位置的映像。[/color]

hashtable的hashcode是根据hash算法来生成的,

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。

这时神马问题?
哈希算法本来就是要保证不同对象的哈希值尽量不同,这样在哈希表中就减少冲突,加快检索速度。

[code="java"]
package com.iteye.wenda.basc;

import java.util.Hashtable;
import java.util.Map;

public class HasCode {
public static void main(String[] args) {
Map map = new Hashtable();
OBean ob = new OBean();
map.put("a", ob);
map.put("b", ob);
System.out.println("-----");
}
}

class OBean{
private String name ;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}
[/code]
如代码:如果你放的key相同里面是一个,也是一个对象,
用不同的key里面肯定存放的是不同的对象拷贝.所以hashCode应该不一样的

我很无语

hashCode一个重要作用本来就是为了区分不同对象的,比如说,你反查一下Object.equals(Object o)方法,内部就用到了hashCode

一般来说hashCode的计算本身就需要对象在内存(或者是虚拟内存地址)中的地址为输入的,不同的对象本身在内存中的地址不同,所以得到的结果不同

LZ可能是以为hashCode与类地址有关,实际上不是,是与对象本身的地址有关的

[quote]hashCode一个重要作用本来就是为了区分不同对象的,比如说,你反查一下Object.equals(Object o)方法,内部就用到了hashCode

一般来说hashCode的计算本身就需要对象在内存(或者是虚拟内存地址)中的地址为输入的,不同的对象本身在内存中的地址不同,所以得到的结果不同

LZ可能是以为hashCode与类地址有关,实际上不是,是与对象本身的地址有关的[/quote]
这个正解。
hashcode的一个作用就是用来区分不同对象的,hashcode相同的可能就是同一个对象了。