集合概述
Java集合类是一种特别有用的工具类,可以存储数量不等的对象,并可以实现常用的数据结构。集合和数组的区别在于,数组是可以存放基本类型的,而集合只能存放对象。
集合分类
Java集合类主要由两个接口派生出来的:Collection接口和Map接口。
- Collection接口
Collection派生出来三个主要的子接口:Set接口、Queue接口、List接口。Set接口类似一个罐子,当对象添加到Set集合时,Set集合时无法记住这个元素的顺序,所以Set集合元素无法重复。List集合则像一个数组,它可以记住每次添加元素的顺序、且List集合的长度可变。而Queue接口主要是实现一些常用的数据结构。 - Map接口
- Map接口用于保存具有映射关系的数据(例如一个人的成绩),Map接口的每项数据都是key-value对。其中key是不可以重复的,其中所有的key可以组成一个Set集合,而value是可以重复的,所有的value又可以组成一个List集合。从实现原理上来看,是先实现了Map,然后让Map的所有value值为null就变成了Set。所以Set其实可以看成一种特殊的Map.
集合的遍历
Collection接口是List、Set、Queue接口的父接口。接口的作用就是抽象它们之间的一些共同特性和操作。所以Collection接口定义了一些适用于操作其所有子接口和子类的方法。这些方法包括了一些基本的集合操作,比如添加、删除、清空集合元素等操作。
集合是用来存放对象的,那么自然少不了对集合元素的访问。对于Set这种集合,是没有办法对它进行单个访问的,所以每次都会整个集合进行一次遍历。然而集合的具体实现类对集合有着不同的实现原理,比如ArrayList底层用的数组实现的方式,而HashSet用的是哈希算法实现。如果要访问集合元素,就要针对不同实现原理,编写相应的访问代码,这样显然是不方便的,所以Java使用了Iterator这个接口来抽象了集合访问,Iterator作为Collection的一个成员变量,这样每个继承了Collection集合的实现类就会带有这个成员变量,然后在自己的类中实现Iterator中的抽象方法,这样具体的集合类都可以通过Iterator这个接口来访问了。这样为每个具体的集合类都提供了统一的访问接口。通过调用同样的方法,就可一访问不同类型的集合,这样也提高了程序的可移植性。
public interface Collection<E> extends Iterable<E>
Iterator<T> iterator();
boolean hasNext();
E next();
Collection接口继承了Iterable接口,而Iterable接口包含了一个方法可以返回Iterator对象。Iterator则包含了访问集合元素的统一操作。这样不论是访问List还是Set都可以调用Iterator的方法。一个Iterator对象对应一个集合对象。
遍历集合元素还有其他方法:
- Java8为Iterable接口增加了forEach(Consumer action)默认方法,可以采用Lamda表达式来遍历集合
- 使用forach循环遍历集合
使用Iterator中的默认方法forEachRemaining(Consumer action)方法,可以采用Lamda表达式来遍历集合。
集合的其他操作
Java8为Collection集合新增了一个removeIf(Predicate filter)方法,使用它可以批量删除符合filter的条件的所有元素,而不用通过遍历集合来一个一个的删除。
使用Stream操作集合,使用Stream操作集合也是极大的方便的对集合元素的操作。Java8为Collection接口提供了一个stream()默认方法,可以返回该集合对应的流,接下来就可以通过stream的方法来对集合进行操作。stream有两种类型的方法,其中中间方法操作完流之后,不会消耗流可以继续调用后续的方法对流进行操作。而末端方法对流进行一次操作之后,流就被消耗了,不能继续调用方法对流进行操作了。常见中间方法
filter(Predicate predicate);
mapToXXX(ToxxxFunction mapper);
peek(Consumer action);
sorted();
limit(long maxSize);
distinct();常见末端方法
- forEach(Consumer action);
- toArray();
- reduce();
- min();
- max();
- count();
- anyMatch(Predicate predicate);
- allMatch(Predicate predicate);
- noneMatch(Predicate predicate);
- findFirst();
- findAny();