从零开始学Java-单列集合:Collection

101 阅读7分钟

在前面我们学习了ArrayList,而ArrayList只是集合中的一种基础而已,我们接下来会继续深入的学习集合。

下面我们一起来往下学习吧:

集合体系结构

image.png

在这么多种集合中,整体上可以分为两类,单列集合双列集合

  • 单列集合:在添加数据的时候每次只能添加一个数据。
  • 双列集合:在添加数据的时候每次都是添加一对数据。

下面我们先来学习一下单列集合吧:

单列集合:Collection

初识Collection

在单列集合中,最顶层的是Collection,下面又可以分为两种单列集合:listSet

我们来看一下他的分裂图:

image.png

下面我们来了解一下这两个系列的集合有什么不同:

  • 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]

这里有两个小细节我们需要注意一下:

  1. 如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的。
  2. 如果我们要往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]

而这里也有两个小细节我们需要注意一下;

  1. 因为Co1lection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除
  2. 方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false,如果要删除的元素不存在,就会删除失败。
  • public boolean contains(object obj) 判断当前集合中是否包含给定的对象
// 4.判断当前集合中是否包含给定的对象
System.out.println("------------contains--------------");
boolean result = coll.contains("bbb");
System.out.println(result);     // true

这里有个小细节需要注意一下: 我们来看一下他底层的源码:

image.png

  1. 底层是依赖equals方法进行判断是否存在的。
  2. 所以,如果集合中存储的是自定义对象,也想通过contains方法来判所是否包含,那么在javabean类中,一定要重写equals方法。
  • public boolean isEmpty() 判断当前集合是否为空
// 5.判断当前集合是否为空
System.out.println("------------isEmpty--------------");
boolean result1 = coll.isEmpty();
System.out.println(result1);    // false

我们也来看一下他的底层源码吧:

image.png

是不是就是判断他的长度是不是为空呀!

  • public int size() 返回集合中元素的个数/集合的长度
// 6.返回集合中元素的个数/集合的长度
System.out.println("------------size--------------");
int size = coll.size();
System.out.println(size);       // 2

好啦,到这里基本的方法就学习完毕啦!下面来学习一下Collection的遍历方式的遍历方式吧:

Collection的遍历方式

  1. 迭代器遍历
  2. 增强for遍历
  3. Lambda表达式遍历

那有的人就会问了?

image.png image.png 我们之前学习的遍历是不是通过索引来遍历的呀,我们学习的list系列有索引可以继续使用for来遍历,而我们现在学习的第二种Set是没有索引的呀,所以就不能通过for来遍历了。那怎么办呢?那我们就来学习他们的通用遍历方式吧:

迭代器遍历

迭代器:在Java中的类是Iterator,迭代器是集合专用的遍历方式。

迭代器特点:迭代器不依赖索引

获取迭代器对象

image.png

迭代器对象常用方法
方法名说明
boolean hasNext()判断当前位置是否有元素,有元素返回true,没有元素返回false
E next()获取当前位置的元素,并将迭代器对象移向下一个位置。

我们来看一张图吧:

image.png

下面我们也来演示一下吧:

代码演示
  • 创建集合并添加元素
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);
}
细节
  1. 报错NoSuchElementException(没有这个元素异常)
  2. 迭代器遍历完毕,指针不会复位(如果还想遍历就创建新的迭代器对象)
  3. 循环中只能用一次next方法
  4. 迭代器遍历时,不能用集合的方法进行增加或者删除

增强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);
}
细节
  1. 修改增强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是什么意思呢?我们来看一下他的底层源码:

image.png

那这里我们就知道了:forEach底层原理:

也是用for遍历集合,依次得到每一个元素,把得到的每一个元素传递给下面的accept方法

下面我们就用Lambda来改写一下吧:

  • Lambda表达式遍历
list.forEach((s)->System.out.println(s));

怎么样,是不是用增强for和Lambda表达式遍历最简单呀,但是迭代器也是需要掌握的噢!

到这里我们单列集合的三种遍历就学习完毕啦,我们来做个总结吧:

总结

  1. Collection是单列集合的顶层接口,所有方法被List和Set系列集合共享
  2. 常见成员方法:addclearremovecontainsisEmptysize
  3. 三种遍历方式:
    1. 迭代器:在遍历的过程中需要删除元素,可以使用迭代器。
    2. 增强for、Lambda:仅仅想遍历,那么可以使用增强for或者Lambda表达式

好啦,到这里单列集合的Collection就学习完毕啦,有什么不懂的可以在评论区互相探讨哟,我们下期来学习Collection的第一种List集合,我们下期不见不散!!!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==