put方法的返回类型如何在Hashtable或HashMap中工作?

时间:2016-01-24 03:44:52

标签: java collections hashmap hashtable

在文档中,HashMap或Hashtable的返回类型是值本身如下,

public V put(K key, V value)

并且,它告诉返回类型是与key关联的先前值,如果没有key的映射,则返回null。 (null返回也可以指示映射先前将null与key关联。)

比如说,如果我按照以下方式编写Hashtable,

    Hashtable<Integer, Character> hash = new Hashtable<Integer, Character>();
    System.out.println(hash.put(12, 'c')); 

现在,上面的代码返回null。我正在实现一个Hashtable,我有点困惑何时返回null或V,其中V将是与key关联的先前值。我的代码如下,

// for dealing w/ the table data
class HashEntry<K, V> {

    private final K key;
    private V value;


    public HashEntry(K key, V value) {

        this.key = key;
        this.value = value;
    }

    public K getKey() {

        return key;
    }

    public V getValue() {

        return value;
    }

    public void setValue(V value) {

        this.value = value;
    }
 } 


class MyHashTable <K, V> {


private int size;
private int DEFAULT_CAPACITY = 16;

private HashEntry<K, V>[] values = new HashEntry[DEFAULT_CAPACITY];


public V put(K key, V value) {

    boolean insert = true;

    for (int i = 0; i < size; i++) {

        if (values[i].getKey().equals(key)) {

            values[i].setValue(value);
            insert = false;
        }

    }

    if (insert) {

        // method for check or increase capacity
        increaseCapacity();
        values[size++] = new HashEntry<K, V>(key, value);
    }

   return null;
   // return value; 
}

我应该在实现中何时返回null或value(类型V)?

1 个答案:

答案 0 :(得分:3)

在您的示例中,这是您第一次为键12分配值,因此返回文档中所述的null,因为没有为该键存储以前的值。

如果你那么:

System.out.println(hash.put(12, 'd'));

&#39; C&#39;将被打印,因为它将作为键12的先前值返回。

根据相关其他信息进行修改:

以下是put方法的可能实现,可以正确返回上一个值。

public V put(K key, V value) {
    boolean insert = true;
    V prevValue = null;

    for (int i = 0; i < size; i++) {
        if (values[i].getKey().equals(key)) {
            prevValue = values[i].getValue();
            values[i].setValue(value);
            insert = false;
        }
    }

    if (insert) {
        // method for check or increase capacity
        increaseCapacity();
        values[size++] = new HashEntry<K, V>(key, value);
    }

    return prevValue;
}