1

NullPointerException尝试将条目放入我的HashTable. 我不认为这是我的私人调整大小方法,而是与我的哈希方法有关。三种方法如下。此外,当数组被实例化时,所有值都设置为 null,并且它们的布尔可用性设置为 true。布尔可用性是查看在何处添加下一个条目(如果它们具有匹配的哈希),因为我们正在执行线性探测实现。

public V put(K key , V value) {
    V v = null;
    int hashVal = hash(key);
    size++;
    if (size >= maxSize) {
        resize();
    } else {
        while (!table[hashVal].isAvailable()) {
            hashVal++;
        }
        table[hashVal]=newtable[hashVal] Entry<K= new Entry < K,V> V > (key, value);
        table[hashVal].setAvailable(false);
        return value;
    }
    return v;
}

private void resize() {
    int _length = 2*length;2 * length;
    maxSize = (int) MAX_LOAD_FACTOR * _length;
    Entry<KEntry < K,V>[] V > [] old = table;
    table=table = new Entry[_length];
    size=0;size = 0;
    for (int i=0;i<oldi = 0; i < old.length; i++) {
        if (!old[i].isAvailable()) {
            put(old[i].getKey(), old[i].getValue());
        }
    } 
}

private int hash(Object o) {
    return (o.hashCode() % length);
}

这是我的入口类: public static class Entry { private K key; 私人V值;可用的私有布尔值;

    public Entry(K key, V value) {
        this.setKey(key);
        this.setValue(value);
        this.setAvailable(true);
    }

    public void setKey(K key) {
        this.key = key;
    }

    public K getKey() {
        return this.key;
    }

    public void setValue(V value) {
        this.value = value;
    }

    public V getValue() {
        return this.value;
    }

    public boolean isAvailable() {
        return available;
    }

    public void setAvailable(boolean available) {
        this.available = available;
    }
}

我在我的 put 方法中的 while 循环中获得了 NPE。

这是我的构造函数,用于初始化我的哈希表以及一些本地变量

private int length, size;
private int maxSize;

/**
 * The underlying array for this hashtable
 */
private Entry<K,V>[] table;


public HashTable() {this(11);}

@SuppressWarnings("unchecked")
public HashTable(int length) {
    this.length=length;
    table=new Entry[length];
    for(int i=0;i<table.length;i++) {
        table[i]=null;
    }
    maxSize=(int)(MAX_LOAD_FACTOR * length);
    size=0;
}
4

1 回答 1

0

如果

所有值都设置为 null

意味着所有的元素tablenull在初始化之后,!table[hashVal].isAvailable()第一次怎么会通过?

在java中,对象的变量是引用。因此table是 的参考Entry[]。你可以把它想象成一个容器。每个元素 ,table[i]也是一个参考。要使其工作,您必须将其指向类型对象的实例Entry。在您的代码table[i]=null中意味着这些引用没有指向任何内容。它们被称为空指针。空指针的调用方法是非法的。这就是为什么您的代码NullPointerException在我上面提到的地方报告的原因。

因此,您所要做的就是替换table[i]=nulltable[i]=new Entry<K,V>(). 该new命令执行实例化,它分配物理内存来制作对象的副本。请注意,这只是Entry执行初始化 an 的代码的时间。实例化后,对该实例的以下函数调用变得合法。虽然从逻辑上讲,该实例表示的哈希槽仍未被占用。

我认为您混合了Entry对象的逻辑角色和机器表示。an 的逻辑作用Entry是表示一个哈希槽。但是它所做的所有花哨的工作都会失败,除非机器通过实例化来生出它。

于 2013-02-20T05:20:22.907 回答