集合中直接remove對象和remove角標(biāo)的區(qū)別

今天寫了一下 Activity的管理類 在移除內(nèi)部Stack與Activity的關(guān)聯(lián)時 本來寫的時候 是直接移除傳入的Activity
然后看了一下 EventBus 的代碼 發(fā)現(xiàn) EventBus 在取消注冊的時候 內(nèi)部是通過如下代碼 實(shí)現(xiàn)的

/** Only updates subscriptionsByEventType, not typesBySubscriber! Caller must update typesBySubscriber. */
private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {
    List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
    if (subscriptions != null) {
        int size = subscriptions.size();
        for (int i = 0; i < size; i++) {
            Subscription subscription = subscriptions.get(i);
            if (subscription.subscriber == subscriber) {
                subscription.active = false;
                subscriptions.remove(i);
                i--;
                size--;
            }
        }
    }
}

然后看下 集合類的內(nèi)部 實(shí)現(xiàn) remove對象方法

public synchronized boolean removeElement(Object obj) {
    modCount++;
    int i = indexOf(obj);
    if (i >= 0) {
        removeElementAt(i);
        return true;
    }
    return false;
}

在indexOf中 遍歷獲取到傳入對象的角標(biāo)

    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

經(jīng)過一番調(diào)用 也是還最后通過遍歷獲取到 傳入對象的角標(biāo) 來移除的 既然都會遍歷的話 我們不如在外部遍歷 用類似的EventBus 的寫法 在移除的同時 將集合和角標(biāo)減一 這樣還可以 避免在遍歷中移除對象 有可能導(dǎo)致的空指針等問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容