【问题标题】:How does the return type of the put method works in Hashtable or HashMap?put 方法的返回类型在 Hashtable 或 HashMap 中是如何工作的?
【发布时间】:2016-04-30 13:04:30
【问题描述】:

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

public V put(K key, V value)

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

说,如果我写一个哈希表如下,

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

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

// 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)?

【问题讨论】:

  • 你有什么不明白的地方?文档中的解释似乎很简单。
  • 什么不清楚?您刚刚引用的文档中详细描述了这种行为。
  • 我编辑了这个问题,它是关于 Hashtable 实现的。

标签: java collections hashmap hashtable


【解决方案1】:

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

如果你这样做了:

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

'c' 将被打印,因为它作为键 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;
}

【讨论】:

  • 你好,谢谢你的回答,我明白了。如果之前与该键关联的任何值,将返回该值。
  • 是的,现在确实如此,您知道有一个持续时间,您只能在之后接受答案。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 2013-04-04
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多