Java 是否有解决此错误的方法…类型集合中的synchronizedSet(Set<;T>;,Object)方法不可见

Java 是否有解决此错误的方法…类型集合中的synchronizedSet(Set<;T>;,Object)方法不可见,java,set,hashtable,Java,Set,Hashtable,我正在实现我在上找到的哈希表功能 我逐字逐句地输入了整个源代码。但是,Eclipse给了我三个错误: 类型集合中的synchronizedSet(Set,Object)方法不可见 来自类型集合的synchronizedCollection(集合,对象)方法不可见 再次调用synchronizedSet()时出现重复错误 以下是错误所在的代码: public Set<K> keySet(){ if (keySet == null) keySet = Colle

我正在实现我在上找到的哈希表功能

我逐字逐句地输入了整个源代码。但是,Eclipse给了我三个错误:

  • 类型集合中的synchronizedSet(Set,Object)方法不可见
  • 来自类型集合的synchronizedCollection(集合,对象)方法不可见
  • 再次调用synchronizedSet()时出现重复错误
  • 以下是错误所在的代码:

    public Set<K> keySet(){
        if (keySet == null)
            keySet = Collections.synchronizedSet(new KeySet(), this);
        return keySet;
    }
    
    private class KeySet extends AbstractSet<K> {
        public Iterator<K> iterator(){
            return getIterator(KEYS);
        }
        public int size(){
            return count;
        }
        public boolean contains(Object o){
            return containsKey(o);
        }
        public boolean remove(Object o){
            return HashTable.this.remove(o) != null;
        }
        public void clear(){
            HashTable.this.clear();
        }
    }
    
    public Set<Map.Entry<K, V>> entrySet(){
        if (entrySet == null)
            entrySet = Collections.synchronizedSet(new EntrySet(), this);
        return entrySet;
    }
    
    private class EntrySet extends AbstractSet<Map.Entry<K, V>> {
        public Iterator<Map.Entry<K,V>> iterator(){
            return getIterator(ENTRIES);
        }
    
        public boolean add(Map.Entry<K,V> o) {
            return super.add(o);
        }
    
        public boolean contains(Object o){
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry entry = (Map.Entry)o;
            Object key = entry.getKey();
            Entry[] tab = table;
            int hash = key.hashCode();
            int index = (hash & 0x7FFFFFF) % tab.length;
    
            for (Entry e = tab[index]; e != null; e = e.next)
                if (e.hash == hash && e.equals(entry))
                    return true;
            return false;
        }
    
        public boolean remove(Object o){
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
            K key = entry.getKey();
            Entry[] tab = table;
            int hash = key.hashCode();
            int index = (hash & 0x7FFFFFF) % tab.length;
    
            for (Entry<K, V> e = tab[index], prev = null; e != null; prev = e, e = e.next){
                if (e.hash == hash && e.equals(entry)){
                    modCount++;
                    if (prev != null)
                        prev.next = e.next;
                    else
                        tab[index] = e.next;
                    count--;
                    e.value = null;
                    return true;
                }
            }
            return false;
        }
    
        public int size(){
            return count;
        }
        public void clear(){
            HashTable.this.clear();
        }
    }
    
    public Collection<V> values(){
        if (values == null)
            values = Collections.synchronizedCollection(new ValueCollection(), this);
        return values;
    }
    
    公共设置键集(){
    如果(键集==null)
    keySet=Collections.synchronizedSet(newkeyset(),this);
    返回键集;
    }
    私有类键集扩展了抽象集{
    公共迭代器迭代器(){
    返回getIterator(键);
    }
    公共整数大小(){
    返回计数;
    }
    公共布尔包含(对象o){
    返回集装箱箱(o);
    }
    公共布尔删除(对象o){
    返回哈希表。this.remove(o)!=null;
    }
    公共空间清除(){
    HashTable.this.clear();
    }
    }
    公共集入口集(){
    if(entrySet==null)
    entrySet=Collections.synchronizedSet(新entrySet(),this);
    返回入口集;
    }
    私有类入口集扩展了抽象集{
    公共迭代器迭代器(){
    返回getIterator(条目);
    }
    公共布尔添加(Map.Entry o){
    返回super.add(o);
    }
    公共布尔包含(对象o){
    如果(!(映射项的实例))
    返回false;
    Map.Entry=(Map.Entry)o;
    Object key=entry.getKey();
    条目[]选项卡=表格;
    int hash=key.hashCode();
    int index=(散列&0x7FFFFFF)%tab.length;
    for(条目e=tab[index];e!=null;e=e.next)
    如果(e.hash==hash&&e.equals(条目))
    返回true;
    返回false;
    }
    公共布尔删除(对象o){
    如果(!(映射项的实例))
    返回false;
    Map.Entry=(Map.Entry)o;
    K key=entry.getKey();
    条目[]选项卡=表格;
    int hash=key.hashCode();
    int index=(散列&0x7FFFFFF)%tab.length;
    对于(条目e=tab[index],prev=null;e!=null;prev=e,e=e.next){
    如果(e.hash==hash&&e.equals(条目)){
    modCount++;
    如果(上一个!=null)
    prev.next=e.next;
    其他的
    tab[index]=e.next;
    计数--;
    e、 值=空;
    返回true;
    }
    }
    返回false;
    }
    公共整数大小(){
    返回计数;
    }
    公共空间清除(){
    HashTable.this.clear();
    }
    }
    公共集合值(){
    如果(值==null)
    values=Collections.synchronizedCollection(newvalueCollection(),this);
    返回值;
    }
    

    我已经研究了
    集合
    源代码以及
    集合
    源代码,并且在我的一生中找到了解决方案

    synchronizedCollection和
    synchronizedSet
    的两个参数版本是包私有方法,只能从
    java.util
    包中的类访问。您链接到的
    grepcode.com
    源代码是
    Hashtable
    的源代码,它是
    java.util
    包的一部分,因此可以使用这些方法。但你不能


    我唯一能建议的就是查看
    集合
    源代码,看看它们是如何实现的,然后尝试做类似的事情。

    两个参数版本的
    synchronizedCollection
    synchronizedSet
    是包私有方法,只能从
    java.util
    包中的类访问。您链接到的
    grepcode.com
    源代码是
    Hashtable
    的源代码,它是
    java.util
    包的一部分,因此可以使用这些方法。但你不能


    我唯一能建议的就是查看
    集合
    源代码,看看它们是如何实现的,然后尝试做类似的事情。

    两个参数版本的
    synchronizedCollection
    synchronizedSet
    是包私有方法,只能从
    java.util
    包中的类访问。您链接到的
    grepcode.com
    源代码是
    Hashtable
    的源代码,它是
    java.util
    包的一部分,因此可以使用这些方法。但你不能


    我唯一能建议的就是查看
    集合
    源代码,看看它们是如何实现的,然后尝试做类似的事情。

    两个参数版本的
    synchronizedCollection
    synchronizedSet
    是包私有方法,只能从
    java.util
    包中的类访问。您链接到的
    grepcode.com
    源代码是
    Hashtable
    的源代码,它是
    java.util
    包的一部分,因此可以使用这些方法。但你不能


    我唯一能建议的就是查看
    集合
    源代码,看看它们是如何实现的,并尝试做一些类似的事情。

    谢谢您为我指明了正确的方向。非常有帮助!我想如果你真的想的话,你可以用反思来调用它们。谢谢你为我指明了正确的方向。非常有帮助!我想如果你真的想的话,你可以用反思来调用它们。谢谢你为我指明了正确的方向。非常有帮助!我想如果你真的想的话,你可以用反思来调用它们。谢谢你为我指明了正确的方向。非常有帮助!我想如果你真的想的话,你可以用反射来调用它们。