在前面我们学习了ArrayList,而ArrayList只是集合中的一种基础而已,我们接下来会继续深入的学习集合。
下面我们一起来往下学习吧:
集合体系结构
在这么多种集合中,整体上可以分为两类,单列集合,双列集合
- 单列集合:在添加数据的时候每次只能添加一个数据。
- 双列集合:在添加数据的时候每次都是添加一对数据。
下面我们先来学习一下单列集合吧:
单列集合:Collection
初识Collection
在单列集合中,最顶层的是Collection,下面又可以分为两种单列集合:list、Set
我们来看一下他的分裂图:
下面我们来了解一下这两个系列的集合有什么不同:
- List系列的集合:添加的元素是有序、可重复、有索引。
- Set系列的集合:添加的元素是无序、不重复、无索引。
下面我们就一起正式的来学习Collection吧:
Collection概念
- Collection:是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的。
- Collection:是一个接口,我们不能直接创建它的对象,只能创建他实现类的对象:
ArrayList
Collection方法
常用的方法如下:
方法名 | 说明 |
---|---|
public boolean add(Ee) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(Ee) | 把给定的对象在当前集合中删除 |
public boolean contains(object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数/集合的长度 |
下面我们来实操一下吧:
Collection方法演示
创建对象:Collection<String> coll = new ArrayList<>();
public boolean add(Ee) 把给定的对象添加到当前集合中
System.out.println("------------add--------------");
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
System.out.println(coll); // [aaa, bbb, ccc]
这里有两个小细节我们需要注意一下:
- 如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的。
- 如果我们要往set系列集合中添加数据,如果当前要添加元素不存在,方法返回true,表示添加成功。如果当前要添加的元素已经存在,方法返回false,表示添加失败。因为set系列的集合不允许重复。
public void clear() 清空集合中所有的元素
// 2.清空集合中所有的元素
System.out.println("------------clear--------------");
coll.clear();
System.out.println(coll); // []
public boolean remove(Ee) 把给定的对象在当前集合中删除
// 3.把给定的对象在当前集合中删除
System.out.println("------------remove--------------");
coll.remove("aaa");
System.out.println(coll); // [bbb, ccc]
而这里也有两个小细节我们需要注意一下;
- 因为Co1lection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除
- 方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false,如果要删除的元素不存在,就会删除失败。
public boolean contains(object obj) 判断当前集合中是否包含给定的对象
// 4.判断当前集合中是否包含给定的对象
System.out.println("------------contains--------------");
boolean result = coll.contains("bbb");
System.out.println(result); // true
这里有个小细节需要注意一下: 我们来看一下他底层的源码:
- 底层是依赖equals方法进行判断是否存在的。
- 所以,如果集合中存储的是自定义对象,也想通过contains方法来判所是否包含,那么在javabean类中,一定要重写equals方法。
public boolean isEmpty() 判断当前集合是否为空
// 5.判断当前集合是否为空
System.out.println("------------isEmpty--------------");
boolean result1 = coll.isEmpty();
System.out.println(result1); // false
我们也来看一下他的底层源码吧:
是不是就是判断他的长度是不是为空呀!
public int size() 返回集合中元素的个数/集合的长度
// 6.返回集合中元素的个数/集合的长度
System.out.println("------------size--------------");
int size = coll.size();
System.out.println(size); // 2
好啦,到这里基本的方法就学习完毕啦!下面来学习一下Collection的遍历方式的遍历方式吧:
Collection的遍历方式
- 迭代器遍历
- 增强for遍历
- Lambda表达式遍历
那有的人就会问了?
我们之前学习的遍历是不是通过索引来遍历的呀,我们学习的list系列有索引可以继续使用for来遍历,而我们现在学习的第二种Set是没有索引的呀,所以就不能通过for来遍历了。那怎么办呢?那我们就来学习他们的通用遍历方式吧:
迭代器遍历
迭代器:在Java中的类是Iterator,迭代器是集合专用的遍历方式。
迭代器特点:迭代器不依赖索引。
获取迭代器对象
迭代器对象常用方法
方法名 | 说明 |
---|---|
boolean hasNext() | 判断当前位置是否有元素,有元素返回true,没有元素返回false |
E next() | 获取当前位置的元素,并将迭代器对象移向下一个位置。 |
我们来看一张图吧:
下面我们也来演示一下吧:
代码演示
- 创建集合并添加元素
Collection<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 获取迭代器对象
Iterator<String> it = list.iterator(); // 创建指针
- 利用循环去获取每一个元素
while (it.hasNext()){ // 判断是否有元素
// next在底层做的两件事情:获取元素、移动指针
String str = it.next(); // 获取元素,移动指针
System.out.println(str);
}
细节
- 报错NoSuchElementException(没有这个元素异常)
- 迭代器遍历完毕,指针不会复位(如果还想遍历就创建新的迭代器对象)
- 循环中只能用一次next方法
- 迭代器遍历时,不能用集合的方法进行增加或者删除
增强for遍历
增强for的底层就是迭代器。
所有的单列集合和数组才能用增强for进行遍历
增强for格式
for(元素的数据类型 变量名:数组或者集合){
}
下面我们也来演示一下吧:
代码演示
- 创建集合并添加元素
Collection<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 利用增强for来遍历集合
// str其实就是一个第三方变量,在循环的过程中依次表示集合中每一个数据
for(String str:list){
System.out.println(str);
}
细节
- 修改增强for中的变量,不会改变集合中原本的数据。
Lambda表达式遍历
Lambda表达式得益于JDK8开始的新技术,提供了一种更简单、更直接的遍历集合的方式。
Lambda遍历方法
方法 | 说明 |
---|---|
default void forEach(Consumer<? super T> action): | 结合lambda遍历集合 |
下面我们也来演示一下吧:
代码演示
- 创建集合并添加元素
Collection<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 我们先来用匿名内部类改写一下看看实现过程吧:
list.forEach(new Consumer<String>() {
@Override
// s 表示集合中的每一个数据
public void accept(String s) {
System.out.println(s);
}
});
forEach是什么意思呢?我们来看一下他的底层源码:
那这里我们就知道了:forEach底层原理:
也是用for遍历集合,依次得到每一个元素,把得到的每一个元素传递给下面的accept方法
下面我们就用Lambda来改写一下吧:
- Lambda表达式遍历
list.forEach((s)->System.out.println(s));
怎么样,是不是用增强for和Lambda表达式遍历最简单呀,但是迭代器也是需要掌握的噢!
到这里我们单列集合的三种遍历就学习完毕啦,我们来做个总结吧:
总结
- Collection是单列集合的顶层接口,所有方法被List和Set系列集合共享
- 常见成员方法:
add
、clear
、remove
、contains
、isEmpty
、size
- 三种遍历方式:
- 迭代器:在遍历的过程中需要删除元素,可以使用迭代器。
- 增强for、Lambda:仅仅想遍历,那么可以使用增强for或者Lambda表达式
好啦,到这里单列集合的Collection就学习完毕啦,有什么不懂的可以在评论区互相探讨哟,我们下期来学习Collection的第一种List集合,我们下期不见不散!!!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==