Collection接口的介绍
- 接口概述
- Collection是集合层级结构的根接口
- 一些集合允许重复元素,一些不行
- JDK中不提供Collection接口的任何直接实现类;只提供其更加具体的子类
- 实现类的要求
- 所有的Collection的实现类都是间接实现其子接口来实现。并且所有的实现类应该提供两个标准的构造方法。
- 能改动集合的方法特征
- Collection中定义的方能够改变集合的方法存在一些特征。在不同的实现类中,这写方法可能产生不同的效果。比如说addAll(Collection())方法,在不同的实现类中,addAll方法的参数要求是不一致的,如果添加同样的元素,在不同的实现类中,返回的结构不一样。
- 所有的子类接口或实现类都应直接的或间接的定义equals()方法
- 实现类重写的equals()和hashCode()方法应该具有这样的一个原则:如果equals返回true,那么两个对象的hashcode的值应该保持相等。
- 默认方法实现(继承或其它)不应用任何同步协议。如果Collection实现具有特定的同步协议,那么它应该覆盖默认实现以应用该协议。
- jdk8中在接口中新增了default方法和static方法,这两种方法可以有方法体
- 接口中的static方法不能被继承,也不能被实现类调用,只能被自身调用
- default方法可以被子接口继承也可以被其实现类所调用,default方法被继承时,可以被子接口覆写
- 如果一个类实现了多个接口,且这些接口中无继承关系,这些接口中若有相同的default方法,则接口实现类会报错,接口实现类必须通过特殊的语法指定该实现类要实现那个接口的default方法
- 接口的定义
public interface Collection<E> extends Iterable<E>{}
//带泛型:支持特定类型的数据的存储
//继承Iterable接口,一次Collection中也有Iterable接口的方法
基础功能
Collection的功能:
- 添加功能:
- boolean add(Object obj) :
- 用于确定集合包含该具体的元素
- 返回值:如果该集合因调用该方法而发生改变则返回True;如果集合不允许重复且有该元素则返回false
- Collection接口支持该方法,在实际实现类中使用其添加元素时可能会有很多的限制,比如有些集合不允许添加null元素,有些集合限制添加元素的具体类型。
- 如果一个集合拒绝添加一个元素的原因不是该元素已经存在,则必须抛出一个异常
- 异常:
UnsupportedOperationException
:假如add操作不被该集合支持;ClassCastException
:假如该添加的元素的类型不被该集合支持,则抛出类型转换异常;NullPointerException
:添加的元素为null,并且该集合不支持存储null元素,则返回空指针异常;IllegalArgumentException
:如果元素的某些属性阻止其添加到该集合IllegalStateException
:如果由于插入限制,此时无法添加该元素;
- boolean addAll(Collection c) :添加集合全部元素
- 删除功能:
-
void clear() :删除所有元素
-
boolean remove(Object o) :
- 从该集合中删除指定的元素,如果该元素存在的话。即:删除元素e,使得(o==null?e == null:o.equals(e))。
- 如果集合中的一个元素因该方法被删除,返回true
- 异常:主要包括空指针异常,类型转换异常,不支持操作异常
-
boolean removeAll(Collection c) :
- 移除一个集合的元素。只要一个元素被移除了,就返回true
- 异常:空指针异常,类型转化异常
-
java default boolean removeIf(Predicate<? super E> filter)
java 8新增加的方法
Java7以前:
对于从一个集合中删除几个元素,不能直接在遍历中对集合进行修改,如果在遍历中一直向集合中添加新元素,会造成死循环,如果在遍历过程中删除元素,会造成下标越界的问题,一般的操作就是通过addAll的方法和removeAl来实现此功能:
public class test { public static void main(String[] args) { List<String> testList = new ArrayList<>(); testList.add("1杨"); testList.add("1李"); testList.add("1王"); testList.add("1张"); testList.add("2杨"); testList.add("2孙"); testList.add("2赵"); List<String> temAddList = new ArrayList<>(); for(String test : testList) { if(test.startsWith("1")) { temAddList.add(test); } } testList.removeAll(temAddList); System.out.println(JSON.toJSONString(testList)); }
java 8:
testList.removeIf(test->test.startsWith("1"));
public class test { public static void main(String[] args) { List<String> testList = new ArrayList<>(); testList.add("1杨"); testList.add("1李"); testList.add("1王"); testList.add("1张"); testList.add("2杨"); testList.add("2孙"); testList.add("2赵"); List<String> temAddList = new ArrayList<>(); testList.removeIf(a->a.startsWith("1")); System.out.println(testList); } }
- 判断功能;
- boolean contains(Object o) :
- 如果集合中至少包含一个o时,返回true
- 类型转化异常:如果Object o的具体类型同集合存储的具体类型不一致时,返回ClassCastException;
- 空指针异常:如果Object o为null,并且该集合不允许存储null元素,则返回NullPointerException;
- boolean containsAll(Collection c) :
- 判断集合中是否包含指定集合元素,只有包含所有元素才叫包含。
- 异常:类型转化异常,空指针异常。如果指定集合中的一个或多个元素与此集合不兼容返回类型转化异常;如果指定集合包含一个或多个空元素,并且此集合不允许空集合,或者指定集合为空,则返回空指针异常。
- boolean isEmpty() :判断集合是否为空
- boolean equals(Object o);
- 将指定的对象与此集合进行比较获取相等
- 一个既不实现类List或Set集合类自定义equals()方法时自定义集合,该集合与任何列表或集合进行比较时必须返回false。
- 获取功能
- Iteratoriterator():迭代器
- 返回一个iterator用于遍历集合的元素
- 当集合为无序集合时,该iterator无法保证遍历元素的顺序
- 长度功能
- int size():元素的个数,如果数量超过Integer.MAX_VALUE个元素就返回Integer.MAX_VALUE
- 交集功能
- boolean retainAll(Collection c) :
- 从集合中删除集合c中不包括的元素,返回值表示原集合是否更改过。
- 其他功能:
- Object[] toArray() :
- 返回包含此集合中所有元素的数组,
- 如果此集合保证其元素的顺序,由其迭代器返回,此方法必须返回相同的顺序,
- 这种方法时基于数组和基于集合之间起到了桥梁的作用
- == T[] toAarray ( T [ ] a )== :返回包含此集合中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型,如果集合指定的数组,则返回该集合,否则将以运行时类型分配新的数组。指定的数组和此集合的大小
- int hashCode();
- 返回此集合的hashcode
- 重写equals方法也必须重写hashCode方法,并且满足当equals方法返回true时,hashcode值应该相等;
- JDK 8 新方法
-
条件删除(见上)
-
javadefault Spliterator spliterator()
- 返回一个Spliterator对象,用来做拆分遍历
-
java default Stream<E> stream()
- 返回一个Stream对象,是JDK8新增的一个接口,该接口与IntStream,DoubleStream都继承与BaseStream接口,最大的好处就是可以过滤筛选元素,不需要像之前一样,要遍历每个元素去做筛选。
-
java default Stream<E> parallelStream()
获取平行的Stream。
迭代器(Iterable)介绍
- 首先Collection继承自Iterable,有iterator()这个方法。Iterable是一个接口,其有iterator()这个方法,返回的是Iterator,Iterator也是一个接口,只有三种方法:hasNext();next();remove()。
- Iterator实际上是在遍历集合,所以遍历集合元素都可以使用iterator 它的具体实现是以内部类的方式实现的
集合使用步骤
- 创建集合对象
- 创建元素对象
- 把元素添加到集合中
- 遍历集合
- 通过集合对象获取迭代器对象
- 通过迭代器对象的hasNext()方法判断是否有元素
- 通过迭代器对象的next方法获取元素并移动到下一个位置
例子
Collection c=new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it=c.iterator();
while (it.hasNext()){
String s=(String)it.next();
System.out.println(s);
}
Collection接口方法的特征
- 常见异常:空指针异常、类型转换异常、操作不支持异常;
- equals方法和hashcode的绑定性
- 涉及集合的增删改查的方法一般会抛出异常。