簡體   English   中英

為什么List.Add(E)返回布爾值而List.Add(int,E)返回void?

[英]Why does List.add(E) return boolean while List.Add(int, E) returns void?

看看javadoc我看到一個ArrayList有一個重載的add方法:

public boolean add(E e)

將指定的元素追加到此列表的末尾。

public void add(int index,E element)

將指定元素插入此列表中的指定位置。 將當前位置的元素(如果有)和任何后續元素向右移動(將其添加到其索引中)。

我注意到第一個返回了一個boolean而第二個返回了一個void 事實證明,第一個add HAS返回一個boolean因為:

返回:true(由Collection.add(E)指定)

所以我去了Collection.add(E)

布爾加法(E e)

確保此集合包含指定的元素(可選操作)。 如果此集合因調用而更改,則返回true。 (如果此集合不允許重復並且已包含指定的元素,則返回false。)

所以我的問題是,為什么add指定返回boolean而不是void? 當我add一些東西時,我希望只做一個操作。

據我所知,還有其他數據結構,與ArrayList相反,不允許重復(例如集合)。 但即使這樣,問題也不可能按照以下方式解決:

public void add(E e){
    if(e is not in set){
        add e;
    }
}

這樣,如果集合中的e IS沒有采取任何行動。 為什么返回boolean而不是void方法更好?

Collection.add是一種非常通用的方法(在Java泛型的意義上 - 在廣泛適用的意義上)。 因此,他們想要一般適用的返回值。

某些類(如ArrayList )始終接受元素,因此將始終返回true 你是對的,在這些情況下,返回類型的void也同樣好。

但其他人,比如Set ,有時候不允許添加元素。 Set的情況下,如果已經存在相等的元素,則會發生這種情況。 了解這一點通常很有幫助。 另一個例子是有界集合(只能容納一定數量的元素)。

您可以問,“無法編碼只是手動檢查?” 例如,有一組:

if (!set.contains(item)) {
    set.add(item);
    itemWasAdded(item);
}

這比你現在做的更冗長,但不是很多:

if (set.add(item)) {
    itemWasAdded(item);
}

但是這種check-then-act行為不是線程安全的,這在多線程應用程序中至關重要。 例如,可能是另一個線程在您檢查第一個代碼片段中的set.contains(item)set.add(item)之間添加了相同的項。 在多線程場景中,這兩個動作確實需要是單個原子動作; 從方法返回boolean使這成為可能。

因為知道是否實際添加了某些內容通常很有用,或者已經存在。

因為這是一個額外的信息,不需要任何費用,在某些情況下可能會有用。 例如:

Set<String> set = new HashSet<String>();
set.add("foobar");
boolean wasAlreadyThere = set.add("foobar");

否則你必須這樣做

boolean wasAlreadyThere = set.contains("foobar");
set.add("foobar");

這需要兩倍的工作(首先你必須查找,然后再次查找添加)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM