天天看点

容器浅析

如果一个程序只包含固定数量且生命周期都是已知的对象,那么这是一个非常简单的程序。通常程序总是根据运行时才知道的某些条件去创建新对象。在此之前,不会知道所需对象的数量,甚至不知道确切的类型。为解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。所以,就不能依靠创建命名的引用来持有每一个对象。

MyType  aReference;

因为不知道实际上需要多少这样的对象。数组是保存一组对象的最有效的方式,但是数组具有固定的尺寸,在更一般的情况下,写程序时并不知道将需要多少个对象,或者是否需要更复杂的方式来存储对象,因此数组尺寸固定这一限制显得过于受限了。

java实用类库提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue和Map。这些对象类型成为集合类,也称为容器。容器提供了完善的方法来保存对象。java容器类都可以自动地调整自己的尺寸。因此,与数组不同,在编程时,可以将任意数量的对象放置到容器中,并且不需要担心容器应该设置为多大。

如果一个类没有显示地声明继承自哪个类,那么它将自动地继承自Object。

通过使用泛型,就可以在编译期防止将错误类型的对象放置到容器中。同时,在将元素从List中取出来时,类型转换也不再是必需的了。因为List知道它保存的是什么类型,因此它会在调用get()时执行转型。这样,通过使用泛型,编译器将会检查放置到容器中的对象类型。

java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:

1)Collection。一个独立元素的序列,比如List、Set、Queue。

2)Map。一组成对的“键值对”对象,允许使用键来查找值。

Collection接口概括了序列的概念——一种存放一组对象的方式。也就是容器中的对象是以某一特定的顺序存在的,而不是随机地、可变的、任意的。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。所有的Collection都可以用foreach语法来遍历。

java容器类库中的两种主要类型,它们的区别在于容器中的每个“槽”保存的元素个数。Collection在每个槽中只能保存一个元素。Map在每个槽中保存了两个对象,即键与之相关联的值。

任何容器,都必须有某种方式可以插入并将它们再次取回。对于List,add()是插入元素的方法之一,而get()是取出元素的方法之一。如果从更高层的角度思考,会发现这里有个缺点:要使用容器,必须对容器的确切类型标称。初看起来这没什么不好,但是考虑下面的情况:如果原本是对着List的编码,但是后面发现如果能够把相同的代码应用于Set,将会显得非常方便,此时应该怎么做呢?迭代器的概念可以用于达成此目的。迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为轻量级对象:创建它的代价非常小。Java的Iterator只能单向移动,这个Iterator只能用来

1)使用Iterator()要求容器放回一个Iterator。Iterator将准备好返回序列的第一个元素。

2)使用next()获得序列中的下一个元素。

3)使用hasNext()检查序列中是否还有元素。

4)使用remove()将迭代器新近返回的元素删除。

如果只是向前遍历List,并不打算修改List对象本身,foreach语法会更加简洁。Iterator能够将遍历序列的操作与序列底层的结构分离。迭代器统一了对容器的访问方式。

继续阅读