Collection集合
集合概述
前面学习过ArrayList集合,那么集合到底是一个什么呢?
集合:集合是Java中提供的一种容器,可以用来存储多个数据
集合与数组的区别
集合和数组都是容器,它们有什么区别?
- 数组的长度是固定的,集合的长度是可变的
- 数组中存储的是同一种数据类型的元素,可以存储基本数据类型也可以存储引用数据类型,集合存储的都是对象,而且对象的数据类型可以不一致。在开发当中一般当对象多的时候,使用集合来存储对象。
集合的框架
JavaSE它提供了满足各种需求的API,我们在使用API的时候,先了解其继承与接口操作的框架,才能了解何时使用哪个类,以及类与类之间如何彼此合作,从而达到灵活的应用。
集合根据存储结构,把它分为两大类:分别是单列集合:java.util.Collection
和双列集合java.util.Map
Collection接口:
- 没有带索引的方法
Collection:是单列集合的根接口,用于存储一系列符合某种规则的元素,它有两种重要的子接口,分别是java.util.List
和java.util.Set
单列集合
Vector集合,ArrayList集合,LinkedList集合,TreeSet集合,HashSet集合,LinkedHashSet集合。
List集合特点:
- 有序的集合(存储和取出元素的顺序相同)
- 允许存储重复的元素
- 有索引,可以使用普通的for循环遍历
继承:子类共性抽取,形成父类(接口)
Set集合特点
- 不允许存储重复的元素
- 没有索引(不能使用普通的for循环)
- TreeSet集合,HashSet集合为无序的集合,LinkedHashSet集合为有序的集合
List接口的主要实现类有ArrayList集合和LinkedList集合,Set接口的主要实现类有HashSet集合和TreeSet集合
学习集合的目标
- 会使用集合存储数据
- 能够遍历集合,把元素从集合当中取出来
- 掌握每种集合的独特性
集合框架体系的学习方式:
- 学习集合框架的顶层:掌握接口或者抽象类当中的共性的方法,所有的子类都可以使用
- 使用底层的集合框架:顶层不是接口就是抽象类,需要使用底层的子类创建对象来使用集合
Collection集合常用功能
Collection集合是所有的单列集合的父类接口,定义的是所有的单列集合中的共性的API方法,所有的单列集合都可以使用共性的方法。增删改查功能,crud操作
1.把给定的对象添加到当前的集合当中:
-
public boolean add(E e);
2.清空集合当中的所有的元素,不删除集合,集合还存在
-
public void clear();
3.把给定的对象从当前集合当中删除掉
-
public boolean remove(E e)
4.判断当前集合当中是否包含给定的对象
-
public boolean contains(E e)
5.判断当前集合是否为空。
-
public boolean isEmpty()
6.获取当前集合元素的个数
-
public int size()
7.把当前集合中元素,存储到一个数组当中
-
public Object[] toArray()
迭代器(iterator)
在程序开发当中,经常需要遍历集合当中的所有元素,针对这种情况,JDK官方有提供了一个接口java.util.Iterator
。iterator接口也是集合当中的一员,但是他与Map,Collection接口不同,Collection和Map接口它主要是用来存储元素的,而iterator主要是用来迭代访问Collection与Map接口当中的元素。因此我们也经常把iterator对象称为迭代器
想要遍历Collection集合当中的元素,首先需要获取该集合的迭代器,通过迭代器完成迭代操作
迭代的概念
迭代:从Collection集合元素的通用获取方式。具体实现:在每次取元素之前首先判断集合当中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再一次取出来,一直把集合当中的所有元素全部取出来。我们把这种取出方式再专业术语上称为迭代。
iterator接口的常用API方法:
1.获取迭代的下一个元素
-
public E next()
2.集合中是否还有元素,如果集合当中仍有元素可以迭代,则返回true,没有元素,则返回false
-
public boolean hasNext()
获取迭代器的方法
public Iterator iterator() :获取集合对应的迭代器,用来遍历集合当中的元素。
iterator是一个接口无法直接使用,需要借助于实现类对象,获取实现类对象的方式比较特殊Collection接口当中有一个API方法。iterator()这个方法的返回值就是一个iterator实现类的对象
-
Iterator<E> iterator()
迭代器使用步骤
- 通过集合的iterator()方法获取此集合元素的迭代器实现类对象,使用Iterator接口进行接收(多态)
- 使用Iterator接口定义的方法hasNext()判断集合当中还有没有下一个元素
- 使用Iterator接口当中的方法next()获取集合当中的下一个元素
迭代器的实现原理
在调用iterator接口当中的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回。当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext方法返回false时,表示迭代器达到了集合的末尾,终止对元素的遍历。如果强硬的再取集合的元素,此时程序就会抛出 没有元素异常: java.util.NoSuchElementException
备注:iterator接口也是有泛型的,迭代器的泛型是跟着集合走的,集合当中定义什么类型,迭代器就是什么类型。
增强for循环
在JDK1.5之后出现类一个新的循环结构,for each 循环,一般也称为增强for循环,专门用来遍历数组和集合的。它的内部原理其实是有个迭代器iterator,在迭代过程中,不能对集合当中的元素进行增删操作。
格式:
for (元素的数据类型 变量名 : Collection集合或者数组){
//操作代码
//......
}
主要用于遍历Collection集合或者数组。在遍历过程中,一定不要进行增删操作。
练习1:遍历数组
int[] arr = {3,5,7,9,12};
for (int i : arr){
System.out.println(i);
}
练习2:遍历集合
//Collection coll = new ArrayList<>();
//姚明 科比 乔丹 /詹姆斯 加索尔 库里
Collection<String> coll = new ArrayList<>();
coll.add("姚明");
coll.add("科比");
coll.add("乔丹");
for (String str : coll) {
System.out.println(str);
}
备注:目标只能是Collection集合或者是数组,增强for循环仅仅是作为遍历操作出现。简化迭代器的操作