目录
1.集合框架体系
集合是用于存储对象的容器。而每种容器内部都有其独特的数据结构,正因为不同的容器内部数据结构不同,使其各自有自己独特的使用场景。虽然每个容器有其独特的结构但是类似的容器还是存在共性的(至少对容器内部对象的操作方法上是存在共性的),所以这些共性方法能被不断抽取,最终形成了集合框架体系。
上图是一张Java集合框架的结构图(摘自《Thinking in Java》),通过上图可以看出Java 的集合主要按两种接口分类:Collection,Map,这里我主要是介绍下Collection接口。
2.Collection 接口简介
Collection接口继承自超级接口Iterator,是Collection层次结构中的根接口。Collection表示一组对象,这些对象也被称为Collection的元素。一些Collection允许有重复的元素,但是另一些则不允许有重复的元素,即可为无序的。JDK不提供此接口的任何直接实现---它会提供更为具体的子接口,这从上面的UML也可以看出来。此接口用来传递Collection,并在需要最大普遍性的地方操作这些Collection。
3.Collection 接口方法
Collection 作为集合的一个根接口,定义了一组对象和它的子类需要实现的 15 个方法
3.1.对集合的基础操作
- int size(); 获取元素个数
- boolean isEmpty(); 是否个数为 0
- boolean contains(Object element); 是否包含指定元素
- boolean add(E element); 添加元素,成功时返回 true
- boolean remove(Object element); 删除元素,成功时返回 true
- Iterator<E> iterator(); 获取迭代器
Collection<String> c1 = new ArrayList<>();
System.out.println(c1.isEmpty()); //是否个数为 0
c1.add("zhangsan");
System.out.println(c1.add("lisi")); //添加元素,成功时返回 true
System.out.println(c1.contains("lisi")); //是否包含指定元素
System.out.println(c1.size()); //获取元素个数
System.out.println(c1.remove("lisi")); // 删除元素,成功时返回 true
Iterator<String> it = c1.iterator(); //获取迭代器
while(it.hasNext()) {
System.out.println(it.next());
}
运行结果:
3.2.还有一些操作整个集合的方法
- boolean containsAll(Collection<?> c) ; 是否包含指定集合 c 的全部元素
- boolean addAll(Collection<? extends E> c) ; 添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true
- boolean removeAll(Collection<?> c) ; 删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true
- boolean retainAll(Collection<?> c) ; 保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
- void clear() ; 删除所有元素
Collection<String> c1 = new ArrayList<>();
c1.add("zhangsan");
c1.add("lisi");
Collection<String> c2 = new ArrayList<>();
boolean addAll = c2.addAll(c1);//添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true
boolean containsAll = c2.containsAll(c1);//是否包含指定集合 c 的全部元素
boolean removeAll = c2.removeAll(c1);//删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true
boolean retainAll = c2.retainAll(c1);//保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
c1.clear();//删除所有元素
3.3.对数组操作的方法
- Object[] toArray() ; 返回一个包含集合中所有元素的数组
- <T> T[] toArray(T[] a) ; 返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型
Collection<String> c1 = new ArrayList<>();
c1.add("zhangsan");
c1.add("lisi");
Object[] arr1 = c1.toArray();//返回一个包含集合中所有元素的数组
String[] arr2 = new String[2];
c1.toArray(arr2);//返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型
3.4.JDK8 新增加的方法
- Stream<E> stream() 获取连续的流
- Stream<E> parallelStream() 获取并行的流
Collection<String> c1 = new ArrayList<>();
c1.add("1");
c1.add("2");
c1.add("3");
c1.add("4");
c1.add("5");
c1.stream().forEach(action -> { //获取连续流
System.out.println(action);//按顺序输出元素
});
c1.parallelStream().forEach(action -> {//获取并行的流
System.out.println(action);//元素输出的顺序不确定
});
4.总结
Collection 接口是类集框架的基础之一,它创建所有类集都将拥有的 15 个核心方法。因为几乎所有集合类集都实现了 Collection接口,所以熟悉它对于清楚地理解框架是必要的。