Logo

郎哥编程

Java集合框架及Collection接口

2018-08-05 1269

文章导读

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


第一小节  初步理解Java集合框架

集合框架包含多个集合类,这些类的功能主要是实现各类对象的存储,这样一组专门用来存储其它对象的类,一般被称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。

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

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

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

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

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

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

●  Collection   表示一组纯数据。

●  Map        表示一组key-value对。

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

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

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

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

blob.png

图1  Java集合框架中容器类的关系

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

第二小节  认识Java集合类Collection接口

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

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

blob.png

图2  Collection接口层次

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各个对象元素。

Iterator接口中定义的方法如下:

● boolean  hasNext()

判断是否有下一个元素。

● Object  next()

返回当前指针指向的元素,并指向下一个元素

● void  remove()

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

下面给出利用Iterator遍历Collection的用法

package com.milihua.fruits;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Person {
    //声明名称属性
    private String name;
    //声明年龄属性,并被初始化为22
    private int age;
   
    //定义一个显式无参构造方法
    public Person()
    {
     this.name = "张三";
     this.age = 22;
    }
 
    //定义一个显式有参构造方法
    public Person(String instrName,int innAge)
    {
     this.name = instrName;
     this.age = innAge;
    }
   
    //定义一个方法,public是修饰符,void表示没有返回值
    public void tell() {
     System.out.println("姓名:" + name + ",年龄:" + age) ;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection<Person> persons = new ArrayList<Person>();
        Person p1 = new Person("张三",32);
        persons.add(p1);
        Person p2 = new Person("王五",29);
        persons.add(p2);
        Iterator<Person> iterator = persons.iterator();
        while (iterator.hasNext()) {
            Person  p =  iterator.next();
            p.tell();
        } 
    }
}

例子代码构建了一个Person,在main方法中声明了Collection集合类,并实例化为ArrayList集合对象,先后添加了p1和P2两个Person对象。最后用Iterator迭代器遍历ArrayList包含的所有Person元素。

文章小结

1、Java集合框架,为我们提供了一套性能优良、使用方便的接口和类。就像我们已经发明了汽车,只需要学会如何使用它们,就可以处理实际应用中出现的问题了。Java集合类大致分为Set、List和Map三大接口。Java集合就像一种容器,可以通过相应的方法将多个对象的引用放入容器中。

2、Collection类是集合类的一个根接口,它定义了15个方法,方法涵盖了集合、线性表、队列、栈等常用数据结构的增加、修改、删出、查询等操作。

思考与练习

1、队列是一种特殊的数据结构,队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出表。要实现队列结构,需要实现下面所列那个接口?

A. List   B. Set  C.Queue

2、请给出遍历集合类元素的具体步骤。


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

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

评论区

登录 后发表评论
暂无评论