我想请问一下hashCode到底代表什么东西呢,对象的hashcode和内存地址有什么关系啊?
Set s1 = new HashSet();
Set s2 = new HashSet();
s1.add(new String("abc"));
s2.add(new String("abc"));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
我这创建了2个不同的hashset对象,他们的内容一样时hashcode就一样,这是不是说只要对象的内容一样,计算的hashcode就一样呢,那他们在内存中是怎么回事啊,内存地址到底是怎么分配的?
还有个问题,这是jdk1.5中hashmap中put方法的源代码,
public V put(K key, V value) {
K k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
for (Entry e = table; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, k, value, i);
return null;
}
hashset的底层实际上是hashmap,通过一个entry数组来是实现的,数组的每一个元素又是一个链表,这个理解了。
不理解这句话 if (e.hash == hash && eq(k, e.key))
这怎么能说明两个对象相同呢,eq方法的实现是用的==,这就是说k和e.key比较的是引用,那如果我超hashset里面add一个内容相同的对象,这个方法返回的比较的是2个对象的引用,应该返回false才对啊,我觉得这个好像永远都不成了啊。
里面还是上面那个问题,这里的e.hash == hash是什么意思啊,hash的本质到底是什么,这个值到底代表什么啊?
我以前就看过这个东西,一直十分困惑,看了你的视频后稍微了解了一点,但是还是有些模糊,希望你能解答的疑惑!
hashCode是指对象的散列码,具体值是由对象的hashCode()方法返回的值,,你甚至可以重写该方法让每个对象的hashCode都一样。散列码一般是和HashTable HashMap这种基于散列码的集合有用,用于提高在集合中查询对象的速度。
而内存地址是对象在内存中的位置,一般和hashCode无关。不过Object对象的hashCode方法是个native方法,有可能和对象的内存地址有关,没深究。
:D 好问题.
HashCode的计算 的确是使用对象中的内容来算的.
所以, 内容一样的对象HashCode是一样的.
还有, 你说的HashMap之类的, 的确是使用HashCode来替换equals, 这是它们为了性能而采用的方法.
还有比较重要的是, 正由于HashMap等是使用HashCode判断两个对象是否'相等',而非使用Equals, 所以, 当对象覆盖了默认的equals后, 一定要相应的修改HashCode方法, 不然, 你equals是'相等'的, 而 在HashMap中又不是'相等'的.
嘿嘿, 就是和查身份证一样的道理...