Java 集合 hasext() 方法

标签 java

Set set = new HashSet();

set.add(1);
set.add(2)

Iterator iter = set.iterator();  // Wher hasnext been overrided
while(iter.hasnext()){

System.out.println(iter.next);
}

Iterator是一个接口(interface),set.iterator返回Iterator引用。 在 HashSet(及其扩展的实现类)中,next 没有被覆盖。 我的疑问是 hasext 方法在哪里被重写(实现)以及它在这种情况下如何链接。

谢谢。

最佳答案

HashSet 返回 Iterator 的实现,它本身不实现 Iterator 。如果你查看HashSet的源代码,你会发现它实际上是由HashMap支持的:

public HashSet() {
map = new HashMap<E,Object>();
}

当您调用 iterator() 方法时,返回的是该映射的迭代器:

public Iterator<E> iterator() {
return map.keySet().iterator();
}

该映射依次存储一个 KeySet...

private final class KeySet extends AbstractSet<K> {
    public Iterator<K> iterator() {
        return newKeyIterator();
    }
    public int size() {
        return size;
    }
    public boolean contains(Object o) {
        return containsKey(o);
    }
    public boolean remove(Object o) {
        return HashMap.this.removeEntryForKey(o) != null;
    }
    public void clear() {
        HashMap.this.clear();
    }
}

当调用 iterator() 方法时,它会返回一个 KeyIterator:

private final class KeyIterator extends HashIterator<K> {
    public K next() {
        return nextEntry().getKey();
    }
}

并且 HashIterator 实现 Iterator:

private abstract class HashIterator<E> implements Iterator<E>

因此,最终,Iterator 的实现是 HashIterator 的私有(private)子类,它作为对客户端隐藏的实现细节而隐藏起来。这就是使用界面的美妙之处!

关于Java 集合 hasext() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19401928/

相关文章:

java - 无法在 Java 中创建...的通用数组

java - 如何将数组存储到 ArrayList 的元素中?

Java:使用字符串 charAt 方法的 for 循环崩溃

java - 导入android.support.v4.app.ActivityCompat;

java - 管理更大、更复杂的应用程序的项目结构

java - android onKeyDown onKeyUp 测量时间

java - i18n 用于静态 html 内容

java - 用于提取字符串的正则表达式从 '=' 开始,到 '\t' 结束

java - Spring Autowiring 仅扫描测试文件

java - HttpResponse 使用 android 问题 : execute always causes exception?