|
|
|
|
移动端

3.4.1 基本类

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍基本类。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 17:30

3.4.1 基本类

图3-15和图3-16显示MyArrayList类。像它的Collections API的对应类一样, 存在某种错误检测以保证合理的限界; 然而, 为了把精力集中在编写迭代器类的基本方面, 我们不检测可能使得迭代器无效的结构上的修改, 也不检测非法的迭代器remove方法。这些检测将在此后3.5节MyLinkedList的实现中指出, 对于这两种表的实现它们是完全相同的。

如5到6行所示, MyArrayList把大小及数组作为其数据成员进行存储。

从11行到38行, 是几个短例程, 即clear、 size、 trimToSize、 inEmpty、 get以及set的实现。

ensureCapacity例程如40行到49行所示。容量的扩充是用与早先描述的相同的方法来完成的: 第45行存储对原始数组的一个引用, 第46行是为新数组分配内存, 并在第47行和48行将旧内容拷贝到新数组中。如42行和43行所示, 例程ensureCapacity也可以用于收缩基础数组, 不过只是当指定的新容量至少和原大小一样时才适用。否则, ensureCapacity的要求将被忽略。在第46行, 我们看到一个短语是必需的, 因为泛型数组的创建是非法的。我们的做法是创建一个泛型类型限界的数组, 然后使用一个数组进行类型转换。这将产生一个编译器警告, 但在泛型集合的实现中这是不可避免的。

图中显示了两个版本的add。第一个add是添加到表的末端并通过调用添加到指定位置的较一般的版本而得以简单实现。这种版本从计算上来说是昂贵的, 因为它需要移动在指定位置上或指定位置后面的那些元素到一个更高的位置上。add方法可能要求增加容量。扩充容量的代价是非常昂贵的, 因此, 如果容量被扩充, 那么, 它就要变成原来大小的两倍, 以避免不得不再次改变容量, 除非大小戏剧性地增加(+1用于大小是0的情形)。

remove方法类似于add, 只是那些位于指定位置上或指定位置后的元素向低位移动一个位置。

剩下的例程处理iterator方法和相关迭代器类的实现。在图3-16中由第77行至第96行显示。iterator方法直接返回ArrayListIterator类的一个实例, 该类是一个实现Iterator接口的类。ArrayListIterator存储当前位置的概念, 并提供hasNext、 next和remove的实现。当前位置表示要被查看的下一元素(的数组下标), 因此初始时当前位置为0。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Visual C# 2005从入门到精通

Microsoft Visual C#功能强大、使用简单。本书全面介绍了如何利用Visual Studio2005和NET Framework来进行C#编程。作者将C#的各种特性娓娓...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊