(一)容器的概念
- 创建命名的引用每次只能持有一个对象。但是在编程中,我们需要在任意时刻和任意位置创建任意数量的对象。为了解决这一问题,我们首先可以想到对象数组,对象数组可以保存多个对象,但是对象数组有固定的尺寸,而我们在写成程序时并不知道需要多少个对象,因此使用数组就会受限。
- 为此,java实用类库中提供了一套相当完整的容器类来解决问题。其中基本类型是List,Set,Queue,Map。这些对象类型也称为集合类。但是java中使用了Collection这个名字来指代该库中的一个特殊子类,因此食用容器来称呼它们。
- 容器提供了完善的方法来保存对象。使用这些工具可以解决数量惊人的问题。
- 可以把容器当作自动扩充尺寸的数组。
(二)容器的使用
- 容器的声明:以ArrayList为例:
ArrayList < E >
E为参数类型,可以有多个;
E指定了这个容器实例可以保存的类型。
举例(使用了预定义的泛型):
import java.util.ArrayList;
class Apple{
private static long coungter;
private final long id = coungter++;
public long id(){
return id;
}
}
public class AppleAndWithGenerics {
public static void main(String[] args) {
//声明ArrayList 存放的都是Apple对象
ArrayList<Apple> apples = new ArrayList<Apple>();
//使用add()方法向ArrayList中添加对象
for (int i = 0; i < 3; i++){
apples.add(new Apple());
}
//调用ArrayList中每个对象的id()方法,并打印信息
//size()方法可以得到有多少个元素被添加进来
//get(i)方法可以访问对象,可以像数组一样使用索引
for (int i = 0; i < apples.size();i++){
System.out.println(apples.get(i).id()
);
}
}
}
当指定了某个类型作为泛型的参数时,并不仅限于该确切类型的对象放置到容器中。向上转型也可以像作用于其他类型一样作用于泛型。
在以上例1的基础上进行修改:
例2:
package www.fanfan.com;
import java.util.ArrayList;
class Apple{
private static long coungter;
private final long id = coungter++;
public long id(){
return id;
}
}
class Gala extends Apple{}
class Fuji extends Apple{}
class Braeburn extends Apple{}
public class AppleAndOrangeWithGenerics {
public static void main(String[] args) {
ArrayList<Apple> apples = new ArrayList<Apple>();
apples.add(new Gala());
apples.add(new Fuji());
apples.add(new Braeburn());
for (Apple c:apples){
System.out.println(c);
}
}
}
(三)基本概念
容器类类库的用途是“保存对象”,可以划分为两个不同的概念:
- Collection:一个独立元素的序列(一种存放一组对象的方式),这些元素都服从一条或多条序列。
(1)List:必须按照插入的顺序保存元素;
(2)Set不能有重复元素;
(3)Queue按照排队规则来确定对象产生的顺序(通常与他们被插入的顺序相同) - Map:一组成对的的“键值对”对象,允许使用键来查找对象。(例如可以使用数字来查找对象,可以使用对象来查找对象,就像使用字典一样。)