第七章集合Collection
7.1 Iterable 接口
首先是集合Collection的的爸爸,列表List的爷爷 Iterable接口。
实现此接口的类队形可以成为for-each循环的目标,也就是增强for循环,它是java中的一种语法糖。
List<Object> lists = new ArrayList<>();
for(Object obj : lists){
}
jdk1.8之前集合的遍历只有Iteractor这一个方法 ,实现该次接口的方法能够创建一个轻量级的迭代器。用于安全的遍历元素,移除元素,添加元素。
总之就是能创建迭代器进行元素的添加和删除的话,就尽量使用迭代器。
也可以使用迭代器的方式进行遍历。
for (Iterator<Object> it = Collections.emptyIterator();it.hasNext();){
System.out.println(it.next());
}
7.2 Collection 接口
Collection是一个顶级接口,用来定义集合的约定。
List 也是一个顶级接口,它继承了Collection接口,同时也是ArrayList、LinkedList等集合元素的父类。
Set接口位于List接口的同一层次,它也继承了Collection接口。Set接口提供了额外的规定,它对add、equals、hashcode方法提供了额外的标准。
Quene是和Set、List接口并列的Collection的三大接口之一。Quene的设计是用来保持元素的访问顺序。除了Collection接口提供的基础操作外,队列还提供了额外的插入、读取、检查操作。
public static void main(String[] args) {
Collection c = new ArrayList();
Collection c1 = new ArrayList();
c1.add("c1");
c1.add("c111");
//增加
c.add(1);
c.add(2);
c.add("s");
c.add(true);
//把另一个集合中的元素添加进来
c.addAll(c1);
System.out.println(c);
//通过值来移除元素
c.remove("c1");
System.out.println("c = " + c);
//是否有交集
System.out.println(c.contains("c111"));
//是否包含c1集合的全部元素
c.add("c1");
System.out.println(c.containsAll(c1));
//从此集合中删除指定集合中不包含的所有元素。
System.out.println(c.retainAll(c1));
System.out.println("c = " + c);
}
7.2.1 List<> 接口
ArrayList
ArrayList是实现了List接口的可扩容数组(动态数组,负载因子0.5)它的内部是基于数组实现的。
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
-
ArrayList可以实现所有可选择的列表操作,允许所有的元素,包括空值。ArrayList还提供了内部存储
list
的方法,它能够完全替代Vector。 -
只有一个例外,ArrayList不是线程安全的容器。如果多个线程中至少有两个线程修改了ArrayList的结构的话,就会导致线程安全问题。
-
作为替代可以使用线程安全的List —— Collections.synchronizedList。
-
ArrayList有一个容量的概念,这个数组的容量就是List用来存储元素的容量。
List list = Collections.synchronizedList(new ArrayList(...));
-
ArrayList具有快速失败机制fail-fast,能够对ArrayList进行失败检测。当迭代过程中该集合在结构上发生变化时,就有可能会发生fail-fast,即抛出ConcurrentModificationException异常
常用方法
更多详细请去查阅Api文档
public class ArrayListDemo {
public ArrayListDemo(<