教学目标
了解集合框架的接口以及实现类。
掌握ArrayList、Vector以及HashMap等常见集合实现类的用法。
了解如何利用泛型存取数据。
前言
在编程时常常需要集中存放多个数据,我们可以用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组则无能为力,而且数组无法保存具有映射关系的数据,如成绩表:语文-87,数学-89,这种数据看上去像两个数组,但这两个数组元素之间有一定的关联关系。
前言
为了保存数量不确定的数据,以及保存具有映射关系的数据(也称为关联数组),Java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也称为容器类。所有集合类都位于java.util包下。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上也是保存对象的引用变量)。
集合
集合:类似于数组,是存放对象的聚集。集合对象中存放的是一组对象。换句话说,集合中的存放的元素是对象。
集合
集合中接口决定了集合API中各个类的基本特性。具体类仅仅是提供了标准接口的不同实现。
集合API中的接口和类主要位于java.util包中;
最基本的接口是Collection接口,该接口定义了操作数据的基本方法.
位于集合框架层次结构顶层的 Collection接口是集合框架的基础,它声明了所有集合类都有的核心方法。Collection接口有2个直接扩展的子接口:List和Set。
不按顺序保存元素,不可重复
按顺序保存元素,可重复
集合框架中的实现类
Collection接口
Collection接口重要的方法有:
public boolean add(Object obj);
//将对象obj加入到当前集合对象中
public boolean addAll(Collection c);
//将集合c中的元素加入到当前集合对象中
public void clear();
//清除当前集合中的所有元素
public boolean contains(Object obj);
//判断当前集合中是否包含obj对象
public Iterator iterator();
//得到当前集合的迭代器
public boolean remove(Object obj);
//删除当前集合中的obj对象
public int size();
//得到当前集合中元素的总数
public boolean isEmpty();
//判断当前集合是否为空
public Object[] toArray();
//将当前集合对象转化成对象数组
注意:
集合类中的许多方法的参数都是Object类型。
Set接口
Set中的元素必须唯一。不允许有重复的元素。不重复是指集合中任意2个对象x和y,x.equals(y)始终为false。
实现了Set接口的类主要有:
AbstractSet:所有Set的实现类都直接或者间接继承AbstractSet父类。
HashSet:内部使用一个哈希表来实现Set集合,并允许存放null元素。不保证元素的排列顺序,顺序有可能发生变化。在编程中常常使用该类。
LinkedHashSet:既有 HashSet 的查询速度,又能保存元素被加进去的顺序去(插入顺序)。
HashSet
HashSet的构造函数如下:
HashSet( ) //构造一个空 set。
HashSet(Collection ?c) //构造一个包含指定 collection 中的元素的新 set。
例:SetDemo.java
注意:
输出结果中集合里的元素没有按照顺序排序。既没有按照输入顺序,也没有按照自然顺序。
输出结果中没有重复元素。如字符串3就没有重复的。但是1有重复的,原因是这里的1是2个对象,字符串型的和基本数据类型的包装类Integer类型的。
基本数据类型要插入进去需要使用我们上节课介绍的基本数据类型的包装类。
向上转型的好处:如果以后我们不用HashSet,改用LinkedHashSet或其他,那么我们只需要将如下语句:
Set set=new HashSet();
改为:
Set set=new LinkedHashSet();
实现改变了,编程改动的工作量较小。应当培养这种良好的面向对象的编程习惯。
Set接口有一个子接口SortedSet,SortedSet中的元素可以保证处于排序状态,一个直接应用类TreeSet。
例:treesetDemo.java
List接口
List接口定义了一个有序的对象集合,允许重复元素存在。
List类似于动态数组或变长数组。List中存放的元素的数量