我想请问一下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的本质到底是什么,这个值到底代表什么啊?
我以前就看过这个东西,一直十分困惑,看了你的视频后稍微了解了一点,但是还是有些模糊,希望你能解答的疑惑!