[英]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.