在实现 Iterable<Item> 的 class 中迭代数组的非空部分
Iterate over non-null portion of array in class implementing Iterable<Item>
我精通其他语言,但对 Java 还是个新手。作为针对特定情况的优化,我正在尝试从一个数组中实现一个可迭代容器 class,因为我知道我的容器一次最多可容纳 4 个项目,并且这些项目每个都属于特定的index, not first in 获取可用的最低索引。
为了避免在遍历列表时检查空值,我只希望对非空值 return 进行迭代...下面对 'iterator()' 的覆盖是否有效?在我开始迭代之前,垃圾收集器是否有机会清除 I return 的可迭代列表?或者是否有更好的方法来实现这一目标?
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 还是个新手。作为针对特定情况的优化,我正在尝试从一个数组中实现一个可迭代容器 class,因为我知道我的容器一次最多可容纳 4 个项目,并且这些项目每个都属于特定的index, not first in 获取可用的最低索引。
为了避免在遍历列表时检查空值,我只希望对非空值 return 进行迭代...下面对 'iterator()' 的覆盖是否有效?在我开始迭代之前,垃圾收集器是否有机会清除 I return 的可迭代列表?或者是否有更好的方法来实现这一目标?
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
实现在内部使用类似弱引用的东西,但这不是你的情况)。