参考文献:《Java疯狂讲义》(第三版)
Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构。除此之外,Java集合还可用于保存具有映射关系的关联数组。
Java集合大致可分为:
1、Set:无序、不可重复的集合;
2、List:有序,重复的集合;
3、Queue:Java5增加,队列集合实现;
4、Map:具有映射关系的集合;
四种体系。
Java的集合类主要有两个接口派生而出:Collection和Map。
Collection和Map是Java集合框架的根接口,这两个接口又包含了子接口或实现类。如图
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。
常用方法:
1、boolean add(object o):添加元素,成功返回true;
2、boolean addAll(Collection c):添加集合c里所有元素;
3、void clear():清楚集合里的所有元素,将集合长度变为0;
4、boolean contains (Object o):返回集合里是否包含指定元素;
5、boolean containsAll(Collection):返回集合里是否包含集合c里的所有元素;
6、boolean isEmpty():返回集合是否为空;
7、boolean remove(Object o):删除集合中的指定元素o,当集合中包含了一个或者多个元素o时,该方法值删除第一个符合条件的元素,成功返回true;
8、boolean removeAll(Collection c):删除集合c中里不包含的元素(交运算),如果该操作改变了调用该方法的集合,则该方法返回true
9、int size():返回集合里元素的个数;
10、Object[] toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。
使用Lambda表达式遍历集合
Java8为Iterable接口新增了一个forEach(Consumer action)默认方法,Iterable接口是Collection接口的父接口,所以Collection集合可以直接调用该方法。
import java.util.*;
public class CollectionEach{
public static void main(String[] args) throws Exception{
Collection books=new HashSet();
books.add("Hello");
books.add("World");
books.add("Learning Java is so happy");
books.forEach(obj->System.out.println(obj));
}
}
Iterator接口(迭代器)
Iterator接口也是Java集合框架的成员,但它与Collection系列,Map系列的集合不一样。
Collection系列,Map系列的集合主要用于盛装其他对象,而Iterator则主要用于遍历(迭代访问)。
Iterator接口定义了4个方法:
1、boolean hasNext():如果被迭代的集合还没有被遍历完,则返回true;
2、Object next():返回集合里的下一个元素;
3、void remove:删除集合里上一次next方法返回的元素;
4、void forEachRemaining(Consumer action):这时Java8为Iterator新增的默认方法,该方法可使用lambda表达式来遍历集合;
知识点:Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法来删除集合中上一次next()方法返回集合元素。
知识点:Iterator迭代器采用的是快速失败机制,一旦在迭代过程中检测到该集合已经被修改(通常是被其他线程所修改),程序立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。
Predicate操作集合
Java8为Collection集合新增了一个removeIf(Predicate filter)方法。
该方法将会批量删除复合filter条件的所有元素。
Predicate也是函数式接口(Consumer类),因此可以使用Lambda表达式。
Stream操作集合
Java8还新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些ApI代表多个支持串行和并行聚集操作的元素。
Java8还为上面每个流式API提供了对应的Builder(建设者模式)
独立使用Stream的步骤如下:
1、使用Stream或XxxStream的buiilder()类方法创建该Stream对应的Builder。
2、重复调用Builder的add()方法向该流中添加多个元素。
3、调用Builder的build()方法获取对应的Stream
4、调用Stream的聚集方法
Stream提供了大量的方法来聚集操作,这些方法既可以是“中间的”,也可以是末端的。
中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。
末端方法:末端方法是对流的最终操作。当对某个Stream执行末端方法后,该流将会被“消耗”且不可再用。