亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

迭代實現 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 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號