(一)為什么需要集合?
因?yàn)閿?shù)組無(wú)法滿足需求。
- 1,數(shù)組長(zhǎng)度不可變
我們可以用數(shù)組保存基本數(shù)據(jù)類型和引用類型,但是數(shù)組長(zhǎng)度是不可變的。如果一開(kāi)始我們想保存的數(shù)據(jù)長(zhǎng)度不明確,使用數(shù)組就會(huì)導(dǎo)致空間沒(méi)被用完或者后續(xù)要往里繼續(xù)添加數(shù)據(jù)時(shí)沒(méi)有空間了。
java集合只能存儲(chǔ)引用類型,不能存放基本數(shù)據(jù)類型。
一個(gè)集合和數(shù)組都只能存儲(chǔ)同一種類型的數(shù)據(jù)。
- 2,數(shù)組無(wú)法保存具有映射關(guān)系的數(shù)據(jù)
比如 冬瓜 - 5元/kg,白蘿卜 - 0.6元/kg,這種數(shù)據(jù)看起來(lái)像兩個(gè)存在關(guān)聯(lián)關(guān)系的數(shù)組,一個(gè)數(shù)組是蔬菜名稱數(shù)組,一個(gè)數(shù)組是對(duì)應(yīng)的價(jià)格數(shù)組。
由于集合就是用于保存數(shù)據(jù)的容器,所以集合類也稱為容器類。
(二)集合類始于兩個(gè)接口

image.png
Collection和Map,它們是集合類的根接口。
其中Collection類還繼承于Iterable接口。
1,Collection源碼
public interface Collection<E> extends Iterable<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();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
2,Iterable源碼
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
3,Map源碼
public interface Map<K,V> {
...
}