根据我的理解,我认为:
我对么?
现在,如果我是正确的,我有以下问题:HashMap内部使用对象的哈希码.因此,如果两个对象可以具有相同的哈希码,那么它如何HashMap使用它所使用的键?
有人可以解释HashMap内部如何使用对象的哈希码吗?
我试图理解,当超过所占用的桶数或所有桶中的条目总数时,会发生散列图的重新发生.意思是,我们知道如果16个桶中的12个(每个桶中有一个条目)已满(考虑到默认的loadfactor和初始容量),那么我们就知道在下一个条目中将重新散列hashmap.但是假设只有3个桶被占用,每个4个条目(总共12个条目,但16个中只有3个桶在使用中)呢?
所以我尝试通过制作最差的哈希函数来复制它,这将把所有条目放在一个桶中.
这是我的代码.
class X {
public Integer value;
public X(Integer value) {
super();
this.value = value;
}
@Override
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
X a = (X) obj;
if(this.value.equals(a.value)) {
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我开始在hashmap中放置值.
HashMap<X, Integer> map = new HashMap<>();
map.put(new X(1), 1);
map.put(new X(2), 2);
map.put(new X(3), 3);
map.put(new X(4), 4);
map.put(new X(5), 5);
map.put(new X(6), 6);
map.put(new X(7), 7);
map.put(new X(8), 8);
map.put(new X(9), 9); …Run Code Online (Sandbox Code Playgroud) 这是我试过的。
import java.util.*;
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<String> s1=new HashSet<String>();
s1.add("Java");
s1.add("C++");
s1.add("C");
s1.add("dotNet");
s1.add("JavaScript");
s1.add("Script");
s1.add("Python");
s1.add("JavaScript");
}
}
Run Code Online (Sandbox Code Playgroud)
输出 [Java、Script、C++、dotNet、C、JavaScript、Python]