为了解决数组在实际的开发过程中所遇到的问题,JAVA提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,统称为集合。
集合怎么用?
集合封装了若干方法——定义了一个集合类型的变量之后,我们可以完成“向该集合变量添加元素”“获取指定下标位置上的元素”等操作。
集合的分类
集合按其存储结构可分为两大类:一类是存储“单个对象”(单列集合Collection),一类是存储“key-value对”(双列集合Map)。集合的主要接口都是由这两个接口派生出来的——Collection和Map是Java集合框架的跟接口,每一个接口又包含了一些子接口和实现类。
Collection接口
Collection是所有单列集合的父类接口。
定义形式:public interface Collection ;
继承体系
Collection包含两个重要的子接口:List和Set。
Collection接口的方法
方法声明 | 功能描述 |
boolean add(Object o) | 向集合中添加一个元素 |
boolean addAll(Collection c) | 将指定Collection中的所有元素添加到该集合中 |
void clear() | 删除该集合中的所有元素 |
boolean remove(Object o) | 删除该集合中指定的元素 |
boolean removeAll(Collection c) | 删除指定集合中的所有元素 |
boolean isEmpty() | 判断该集合是否为空 |
boolean contains(Object o) | 判断该集合中是否包含某个元素 |
boolean contains(Collection c) | 判断该集合中是否包含指定集合中的所有元素 |
Iterator iterator() | 返回在该集合的元素上进行迭代的迭代器(Iterator) ,用于遍历该集合搜友元素 |
int size() | 获取该集合元素个数 |
这些方法可用于操作所有的单列集合。
泛型
集合可以储存任何的引用类型。但这样会使得当有错误的数据输入时,没有办法在编译期间进行检查和控制,在使用上很难确保安全性。
public class ParameterType{
public static void main(String[] args){
ArrayList list=new ArrayList();
Teachers tch1=new Teachers("FY0002010");
Teachers tch2=new Teachers("FY0002013");
Students stu1=new Students("20100011");
Students stu2=new Students("20100012");
list.add(tch1);
list.add(tch2);
list.add(stu1);
list.add(stu2);//无论是Trachers类的对象还是Students类的对象,存入集合后会统一被“记”为Object
for(int i=0;i<list.size();i++){
Teachers tch=(Teachers)list.get(i);//集合元素要调用Teachers类的work方法,必须向下转型为Teachers类的对象;
//若某个集合元素不是Teachers对象,运行时就要出现异常。
tch.work();
}
}
}
为此Java提供了泛型来解决这个问题。
- 泛型:即参数化数据类型的能力,是指在创建类、接口或方法允许操作的数据类型。
- 格式:ArrayList< Integer > List=new ArrayList < Integer >();
- 注:泛型必须是引用类型(类/包装类、接口、数组、枚举),不能是int、double之类的基本数据类型;
public class ParameterType{
public static void main(String[] args){
ArrayList<Teachers> list=new ArrayList<Teachers>();
Teachers tch1=new Teachers("FY0002010");
Teachers tch2=new Teachers("FY0002013");
Students stu1=new Students("20100011");
Students stu2=new Students("20100012");
list.add(tch1);
list.add(tch2);
*list.add(stu1);//出错提示:类型不符
*list.add(stu2);//出错提示:类型不符
for(int i=0;i<list.size();i++){
Teachers tch=(Teachers)list.get(i);
tch.work();
}
}
}
泛型的优点:能够在编译时而不是在运行时检查类型安全。