Logo

郎哥编程

集合框架与Collection接口

2021-07-04 228

学习目标:了解集合框架与Collection接口。

集合框架

不同的方法和数据结构的选取,性能会存在很大差异,如何快速搜素百万级的数据项?如何快速地实现队列的排序?如何将有用的数据加入队列,或从队列中删除无用的数据?如何建立类似地图的数据,通过地图数据就可以找到实际的地址?为解决上述问题,Java提供了一套特殊的类——集合类。

集合类的功能就是实现各种方式的数据存储,这样一组专门用来存储其它对象的类,一般被称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。

在数学概念中,集合是由一个或多个确定的元素构成的整体。具体来说是指具有某种特定性质、具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素。例如,在数学概念整数集合里,数值…、-1、0、1、2…是整数集合的元素。

在Java语言中,集合是用来存储多个同种类型的数据结构。前面讲过的数组也可以存储多个同种类型的数据,与集合不同的是,数组存储数据元素的个数是固定的,而集合长度是可以动态改变的,也可以把集合理解为能够动态改变长度的数组。

数组有插入、删除、修改、查询操作,集合同样也有插入、删除、修改、查询操作。在学习使用一个具体的集合类时,只要把这四个操作弄清楚了,基本上就可以说掌握这个集合类了。

框架定义了一套规范,用来定义、操作集合类,使具体操作与实现细节解耦。Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(CollectionFramework)。Java集合框架实现了常用的基本数据结构,如:集合、线性表、队列、栈、映射表等。

Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。

在集合框架的类继承体系中,最顶层有两个接口:

Collection 

表示一组纯数据。

Map

表示一组key-value对。

集合类继承或实现这两个接口时,一般需要提供两个“标准”的构造函数,分别是:

(1)没有参数的构造函数,创建一个空的集合类。

(2)有一个类型与基类(Collection或Map)相同的构造函数,创建一个与给定参数具有相同元素的新集合类。

集合框架中容器类的关系如下图所示:

12.jpg

Java集合框架主要由Collection接口和Map接口构成,Collection接口有子接口List、Set、Queue接口。常用的集合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等,还有一些遗留的早期版本的集合类,如:Vector、Stack、HashTable等。

Java集合框架,为我们提供了一套性能优良、使用方便的接口和类。就像我们已经发明了汽车,只需要学会如何使用它们,就可以处理实际应用当中出现的问题了。

Java集合类大致分为Set、List和Map三大接口。Java集合就像一种容器,可以通过相应的方法将多个对象的引用放入容器中。

Collection接口

Collection接口作为集合的一个根接口,它提供了对集合对象进行基本操作的通用接口方法,接口在Java 类库中有很多具体的实现。其意义是为各种具体的集合提供了最大化的统一操作方式。

JDK不提供此接口的任何直接实现,而是提供更具体的子接口,具体有Set接口、List接口、Queue接口。Set接口存放的元素是无序的且不包含重复元素(对象);List接口存放的元素是有序的且允许有重复的元素;Queue接口存放的元素顺序符合先入先出的规则,和我们日常生活中的排队模型很类似。Collection接口层次如下图所示:

13.jpg

Collection接口定义了一组对象和它的子类需要实现的 15 个方法,下面分类列出并说明。

1、容器类中添加、删除的操作方法

● boolean  add(Object  obj)

将Object对象添加到collection。

● boolean  remove(Object  obj)

如果collection中有与obj相匹配的对象,则删除该对象。

2、容器类中元素查询的操作方法

● int  size()

返回当前集合中元素的数量。

● boolean  isEmpty()

从当前collection中查询是否包含元素。

● boolean  contains(Object  obj)

查找此collection是否包含指定的元素。

● boolean  contains(Collection  collec)

判断此Collection是否包含指定Collection中所有元素。

● Iterator  iterator ()

返回此Collection上的迭代器,用来访问该Collection中各个元素。

● boolean  contains All(Collection  collec)

判断Collection是否含有collec中的所有元素。

3、容器类中的组操作方法

● boolean  addAll(Collection  collec)

将指定的collec中的所有元素添加到当前Collection。

● void  clear()

删除当前Collection中的所有元素。

● void  removeAll(Collection  collec)

从当前Collection中删除collec中的所有元素。

● void  retainAll(Collection  collec)

从当前Collection中删除collec中不包含的元素。

4、转换操作,用于集合与数组间的转换

● Object[]  toArray()

将当前Collection转成对象数组

● Object[]  toArray(Object[]  a)

返回一个内含当前Collection所有元素的array。

在Collection中并未提供get()方法获取元素。如果要遍历Collection中的元素,一般要采用Iterator迭代器,可以通过Iterator迭代器遍历Collection各个对象元素。

5、Iterator接口(迭代器)中定义的方法如下:

● Iterator  Iterator ()

返回集合的迭代器,用于遍历集合中对象。

● boolean  hasNext()

判断当前迭代器是否有下一个元素。

● Object  next()

返回当前迭代器指向的对象元素,并指向下一个对象元素

● void  remove()

删除当前迭代器所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素。

Collection是接口类,不能实例化为对象,但可以实例化Collection接口的实现类,并把实现类的对象引用向上转型为Collection接口类型。

例如:

Collection  list = new ArrayList();

在上面的例句中,ArrayList是Collection接口的实现类,代码将ArrayList的实例化对象赋值给Collection接口类型的变量list,此时可以使用list来存储继承于Object类的实例化对象。

案例1:建立CollectionTest类,实例化ArrayList对象,并将对象引用赋值给Collection类型的list变量,此时的list变量的值指向ArrayList的对象引用,因此list变量也可以称为list集合,使用list集合添加String对象,最后输出list集合中的String对象。

新建项目PUnit10,在PUnit0项目新建collection包,在collection包下新建CollectionTest类。代码如下:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class CollectionTest {
    public static void main(String[] args) {
        // 实例化ArrayList对象
        Collection list = new ArrayList();
        // 添加String对象到list集合
        list.add("编程语言");
        list.add("java");
        list.add("Python");
 
        // 获取list集合的迭代器
        Iterator iterator = list.iterator();
        // 使用while循环迭代集合中对象
        while (iterator.hasNext()) {
            String  str =  (String)iterator.next();
            System.out.println(str);
        }
 
    }
   
}

CollectionTest类的main方法中声明了Collection类型的list变量,实例化的ArrayList集合对象向上转型并赋值给list,list集合先后添加三个String对象。最后用Iterator迭代器遍历集合存储的所有String对象。集合中的对象类型都为Object类型,从集合中取得对象,必须把它转换成原来的类型。

Collection接口、ArrayList类、Iterator类都在APL库java.util包内,需要使用import语句导入这三个类。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论