java - 迭代实现 Iterable<Item> 的类中数组的非空部分

标签 java arrays iterator subclass implements

我对其他语言有经验,但对 Java 很陌生。作为针对特定情况的优化,我尝试从数组实现可迭代容器类,因为我知道我的容器一次最多容纳 4 个项目,并且这些项目每个都属于特定索引,而不是第一个索引in 获取可用的最低索引。

为了避免在迭代列表时检查空值,我只希望返回非空值进行迭代...下面的“iterator()”重写是否有效?在我迭代它之前,垃圾收集器是否有机会清除我返回的可迭代列表?或者有更好的方法来实现这一点吗?

class FixedArray<T> implements Iterable<T> {

    FixedArray() {}

    public void add(byte index, T item) {
        array[index] = item;
    }

    @Override
    public Iterator<T> iterator() {
        List<T> listWithoutNull = new ArrayList<>();
        for (Item item: array) {
            if (item != null) {
                listWithoutNull.add(item);
            }
        }
        return listWithoutNull.iterator();
    }

    private final T[] array = { null, null, null, null };
}

最佳答案

Would the below override of 'iterator()' work?

是的,为什么不呢?重写 iterator() 是完全没问题的。然而,这不是一个有效的实现。我会写这样的东西:

@Override
public Iterator<T> iterator() {
    return Arrays.stream(array).filter(Objects::nonNull).iterator();
}

这里,不会创建中间集合,因此没有开销。

And is there any chance the garbage collector going to clear up the iterable list I return before I get to iterate over it?

不,当您持有对 Iterator 对象的强引用时,垃圾收集器不允许执行此操作(除非您的 Iterator 实现在内部使用了弱引用之类的东西)但这不是你的情况)。

关于java - 迭代实现 Iterable<Item> 的类中数组的非空部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57738724/

相关文章:

javascript - 匹配两个数组作为数组的对象

c++ - C++ 迭代器是否应该在传递最后一项后递减?

java.lang.ClassCastException : java. lang.String 无法转换为 net.minidev.json.JSONObject

C++:获取数组中char元素的索引

java - Spring Web MVC 无法将文件上传到服务器

C - 未初始化的指针 -> 指向数组

Java - ListIterator 和 hasNext

c++ - 我应该使用什么 STL 容器来行走一棵树?

java - Selenium Java - 错误 - org.openqa.selenium.support.ui.UnexpectedTagNameException : Element should have been "select" but was "input"

java - 使用 SimpleXML 很容易解决问题。我做错了什么?