(一)为什么需要集合?
因为数组无法满足需求。
- 1,数组长度不可变
我们可以用数组保存基本数据类型和引用类型,但是数组长度是不可变的。如果一开始我们想保存的数据长度不明确,使用数组就会导致空间没被用完或者后续要往里继续添加数据时没有空间了。
java集合只能存储引用类型,不能存放基本数据类型。
一个集合和数组都只能存储同一种类型的数据。
- 2,数组无法保存具有映射关系的数据
比如 冬瓜 - 5元/kg,白萝卜 - 0.6元/kg,这种数据看起来像两个存在关联关系的数组,一个数组是蔬菜名称数组,一个数组是对应的价格数组。
由于集合就是用于保存数据的容器,所以集合类也称为容器类。
(二)集合类始于两个接口
image.pngCollection和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> {
...
}
网友评论