为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2023-06-28 15:41:05
我对其他语言有经验,但对 Java 很陌生。作为针对特定情况的优化,我尝试从数组实现可迭代容器类,因为我知道我的容器一次最多容纳 4 个项目,并且这些项目每个都属于特定索引,而不是第一个索引in 获取可用的最低索引。为了节省我在迭代列表时检查 null 的情况,我只希望返回迭代的非空值...下面的“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 };}
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

下面的“iterator()”重写会起作用吗?


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


@Override

public Iterator<T> iterator() {

    return Arrays.stream(array).filter(Objects::nonNull).iterator();

}

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


在我迭代它之前,垃圾收集器是否有机会清除我返回的可迭代列表?


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


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信