Java 提高HashMap的速度

Java 提高HashMap的速度,java,hashmap,Java,Hashmap,刚刚编写了我自己的HashMap实现,带有开放寻址,键类型是int,值类型是long。但它的工作速度比现有的java实现要慢,即使我只是添加了一个新的值。有什么办法让它更快 public class MyHashMap { private int maxPutedId =0; private int size; private int[] keys; private long[] values; private boolean[] change; public MyHashMap(int si

刚刚编写了我自己的HashMap实现,带有开放寻址,键类型是int,值类型是long。但它的工作速度比现有的java实现要慢,即使我只是添加了一个新的值。有什么办法让它更快

public class MyHashMap {
private int maxPutedId =0;
private int size;
private int[] keys;
private long[] values;
private  boolean[] change;
public MyHashMap(int size){
    this.size = size;
    keys = new int[size];
    values = new long[size];
    change = new boolean[size];
}
public MyHashMap(){
    this.size = 100000;
    keys = new int[size];
    values = new long[size];
    change = new boolean[size];
}
public boolean put(int key, long value){
    int k = 0;
    boolean search = true;
    for(int i = 0;i<maxPutedId+2;i++){
        if(search&& !change[i] && keys[i] == 0 && values [i] == 0 ){
            k=i;
            search = false;
        }
        if(change[i] && keys[i] == key ){
            return false;
        }
    }
    keys[k] = key;
    values[k] = value;
    change[k] = true;
    maxPutedId = k;
    return true;
}
public Long get(int key) {
    for (int i = 0; i < size; i++) {
        if (change[i] && keys[i] == key) {
            return values[i];
        }
    }
    return null;
}
    public int size(){
    int s = 0;
    for(boolean x: change){
        if(x) s++;
    }
    return s;
}}
公共类MyHashMap{
私有int maxPutedId=0;
私有整数大小;
私有int[]密钥;
私人价值观;
私有布尔[]变化;
公共MyHashMap(整数大小){
这个。大小=大小;
键=新的整数[大小];
值=新长[尺寸];
更改=新布尔值[大小];
}
公共MyHashMap(){
该尺寸=100000;
键=新的整数[大小];
值=新长[尺寸];
更改=新布尔值[大小];
}
公共布尔put(整型键,长值){
int k=0;
布尔搜索=真;

对于(int i=0;i您尚未实现哈希表;没有进行哈希运算。例如,get()方法正在对键数组进行线性遍历。哈希表实现应该能够计算最有可能找到键的数组项(事实上,如果它存在并且没有哈希冲突,就会被找到)

一个简单的哈希表如下所示:我们首先从键计算一个哈希。然后我们查看表中的插槽。理想情况下,这就是找到键的位置。但是,如果键不在那里,可能是由于冲突,所以我们扫描(假设打开寻址)在后续插槽中查找密钥-直到我们查看了整个表或找到了一个未占用的插槽

我写了“get”,因为它看起来更简单:-)

这是“超出我头脑的”代码,因此您需要仔细检查

Long get(int key) {
    int h = hash(key);

    // look in principal location for this key
    if (change[h] && keys[h] == key)
        return values[h];

    // nope, scan table (wrapping around at the end)
    // and stop when we have found the key, scanned
    // the whole table, or met an empty slot
    int h0 = h; // save original position
    while ((h = (h+1) % size) != h0 && change[h])
        if ( keys[h] == key)
            return values[h];

    return null;
}
我可能应该先写“put”更具教育意义


用于
int
键的散列函数可以计算为
key%size
。这是否是一个好的散列取决于键的分布;您需要一个避免冲突的散列。

我不明白为什么这样做。大小是1000。如果我放的第一个键是125(键[0]是125)带有一些值。您的方法将开始从键[125]和下面的键进行搜索,并且永远不会找到我只编写的
get
。您需要编写一个类似的
put
。如果散列(125)等于125,则假设键[125],您的
put(125,value)
将在键[125]处插入条目是空的。这是哈希表的本质——哈希函数指示条目应该去哪里。这就是为什么它比简单数组快;没有冲突,插入和查找是O(1)而不是O(n)。谢谢,我终于理解了。