You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java链式哈希表程序报错:ChainHash类构造方法、add方法未定义

问题根本原因

你出现的两处报错全部是ChainHash类的代码结构错误导致:

  1. 成员定义位置错误:ChainHash类的哈希表属性(size、table数组)、构造方法、add/remove/search/dump等业务方法全部错误写在了内部Node类中,外层ChainHash类本身是空实现,自然找不到对应的构造方法和成员方法。
  2. 构造方法写法错误:即便把代码移到外层,你当前写的构造方法加了void返回值,Java中构造方法不能定义返回值,加了void会被识别为普通成员方法,不会在类实例化时被调用。

修正后的ChainHash类完整代码

package week14;

public class ChainHash<K,V> {
    class Node<K, V> {
        private K key;
        private V data;
        private Node<K, V> next;

        public Node(K key, V data, Node<K, V> next) {
            this.key = key;
            this.data = data; 
            this.next = next;
        }
        
        K getKey() {
            return key;
        }   
        
        V getValue() {
            return data;
        }
    }   

    // 以下属性和方法从Node类移到ChainHash外层类
    private int size;
    private Node<K,V>[] table;
    
    // 去掉构造方法的void返回值
    public ChainHash(int capacity) { 
        try {
            table = new Node[capacity];
            this.size = capacity; 
        } catch (OutOfMemoryError e) {
            this.size = 0;
        }
    }
    
    public int hashValue(Object key) {
        return key.hashCode() % size;       
    }
    
    public V search(K key)  {
        int hash = hashValue(key);
        Node<K,V> p = table[hash];
        
        while (p != null) {
            if (p.getKey().equals(key))
                return p.getValue();
        
            p = p.next;
        }
    
        return null;    
    
    }
    
    public int add(K key, V data)   {
        int hash = hashValue(key);
        Node<K,V> p = table[hash];
        
        while (p != null) {
            if (p.getKey().equals(key))
                return 1;
        
            p = p.next;
        }
    
        Node<K,V> temp = new Node<K,V>(key, data, table[hash]);
        table[hash] = temp;
        return 0; 
    }       
    
    public void dump() {
        for (int i=0; i<size; i++) {
            Node<K,V> p = table[i];
            System.out.printf("%02d ", i);
            
            while (p != null) {
                System.out.printf("-> %s (%s) ", p.getKey(), p.getValue());
                p = p.next;
            }
            
            System.out.println();
        }
    }
    
    public int remove(K key)    {
        int hash = hashValue(key);
        Node<K,V> p = table[hash];
        Node<K,V> pp = null;
        
        while (p != null) {
            if (p.getKey().equals(key)) {
                if (pp == null)
                    table[hash] = p.next;
                else 
                    pp.next = p.next;
            
                return 0;
            }
        
            pp = p;
            p = p.next;
        }
        
        return 1;   
    }
}

修正后两处报错都会消失,可正常运行哈希表的增删查改功能。

内容的提问来源于stack exchange,提问作者RainyDay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:54:05