每天五分鐘搞定Java面試
阿新 • • 發佈:2019-02-16
Set集合有個重要的性質:元素不重複
Set是Collection的子介面,Collection是Iterable子介面
public interface Set<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
}
同時繼承Collection介面的parallelStream, removeIf, stream方法
父介面 : Collection, Iterable
子介面: NavigableSet, SortedSet
實現類: AbstractSet, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet
通過看原始碼,會發現Set介面中的方法在Collection中已經定義過,為什麼還要在Set中重寫父類方法。當然方法之上的註釋是有差別的。
List、Set和Queue雖然都是Collection的子介面,但是他們的性質不同,比如說Set中的元素是不可重複的,通過重寫父類方法,並且修改註釋,可以更好的進行區分,使用時也更加清晰明確。同時Set介面下還有子介面,如果我們通過它的子介面檢視父介面,發現其中沒有任何方法,那還要再往上查詢父介面。這種分層的設計,也使得集合介面的變更更加靈活,假設如果Collection介面哪天廢棄了,List介面及其子介面依舊可以提供服務。