本片博文参考拭心的Java 集合框架深入理解 系列
自己学习理解的一篇博文
基于jdk1.8下研究学习。
Collection
首先仍然借用此图:
集:存储多个元素的容器。
如上图所示,java中集的主要为:Collection 和 Map;两者适用的场景也不一样,实现类及方式也各不相同;
这篇文字就主要讲讲Collection;
Collection接口
Collection接口中一口气定义了多个基本的方法;
int size(); // 获取集合大小
boolean isEmpty(); // 校验集合是否为空(是否为0更准确)
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); // 是否包含集合c中所有元素
boolean addAll(Collection<? extends E> c); // 添加集合c所有元素到本集合中
boolean removeAll(Collection<?> c); // 删除本集合中和集合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(); // 获取hashCode
@Override
default Spliterator<E> spliterator() { // 创建一个Spliterator在这个集合中的元素。
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() { // 获取连续的流
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() { // 获取并行流
return StreamSupport.stream(spliterator(), true);
}
在我认为最主要学习Collection的目的就在于,它是大部分集合实现类的母接口,了解母接口有什么方法,对于理解其他实现类有很好的辅助。同时学习Collection接口最重要一点就是我们写高扩展方法;
举个例子:
public interface MobService {
void TestCollection(Collection<?> c);
}
TestCollection(Collection<?> c)方法中参数我们设为Collection<?> c,使用泛型特性和接口实现特性,就可以写出高扩展的方法。
public class DefaultMobServiceImpl implements MobService {
@Override
public void TestCollection(Collection<?> c) {
ArrayList<People> list = (ArrayList<People>) c;
………
}
}
public class MobServiceImpl implements MobService {
@Override
public void TestCollection(Collection<?> c) {
LinkedList<People> list = (LinkedList<People>) c;
………
}
}
以上就是一个接口定义的方法中使用母接口的简单例子;
对Collection接口设计的看法
Collection是一个接口,定义了一整套关于集合的框架体系;
为什么需要这样设计呢?
简单点来说,就是为了方便拓展,数据结构的实现方式有许多种不同方式;大名鼎鼎的List接口就是继承了Collection接口、继承了Collection接口还有Set和Queue等。
因此Collection接口是java实现的关于“集”的顶层接口定义。相对应的如果你有自己的想法也可以根据这个接口去编写你的数据集实现。
补充:
在JDK1.8以后Collection添加了聚合操作,但因本人并没有去深究,因此本文并不去讲解,有需要的可以到参考资料中的地址中学习。