|
|
|
|
移动端

3.3.3 List接口、 ArrayList类和LinkedList类

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

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

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


3.3.3 List接口、 ArrayList类和LinkedList类

本节跟我们关系最大的集合就是表(list), 它由java.util包中的List接口指定。List接口继承了Collection接口, 因此它包含Collection接口的所有方法, 外加其他一些方法。图3-9解释其中最重要的一些方法。

get和set使得用户可以访问或改变通过由位置索引idx给定的表中指定位置上的项。索引0位于表的前端, 索引size()-1代表表中的最后一项, 而索引size()则表示新添加的项可以被放置的位置。add使得在位置idx处置入一个新的项(并把其后的项向后推移一个位置)。于是, 在位置0处add是在表的前端进行的添加, 而在位置size()处的add是把被添加项作为新的最后项添入表中。除以AnyType作为参数的标准的remove外, remove还被重载以删除指定位置上的项。63最后, List接口指定listIterator方法, 它将产生比通常认为的还要复杂的迭代器。ListIterator接口将在3.3.5节讨论。

List ADT有两种流行的实现方式。ArrayList类提供了List ADT的一种可增长数组的实现。使用ArrayList的优点在于, 对get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵, 除非变动是在ArrayList的末端进行。LinkedList类则提供了List ADT的双链表实现。使用LinkedList的优点在于, 新项的插入和现有项的删除均开销很小, 这里假设变动项的位置是已知的。这意味着, 在表的前端进行添加和删除都是常数时间的操作, 由此LinkedList更提供了方法addFirst和removeFirst、 addLast和removeLast、 以及getFirst和getLast等以有效地添加、 删除和访问表两端的项。使用LinkedList的缺点是它不容易作索引, 因此对get的调用是昂贵的, 除非调用非常接近表的端点(如果对get的调用是对接近表后部的项进行, 那么搜索的进行可以从表的后部开始)。为了看出差别, 我们考察对一个List进行操作的某些方法。首先, 设我们通过在末端添加一些项来构造一个List。

不管ArrayList还是LinkedList作为参数被传递, makeList1的运行时间都是O(N), 因为对add的每次调用都是在表的末端进行从而均花费常数时间(可以忽略对ArrayList偶尔进行的扩展)。另一方面, 如果我们通过在表的前端添加一些项来构造一个List:

那么, 对于LinkedList它的运行时间是O(N), 但是对于ArrayList其运行时间则是O(N2), 因为在ArrayList中, 在前端进行添加是一个O(N)操作。

下一个例程是计算List中的数的和:

这里, ArrayList的运行时间是O(N), 但对于LinkedList来说, 其运行时间则是O(N2), 因为在LinkedList中, 对get的调用为O(N)操作。可是,要是使用一个增强的for循环, 那么它对任意List的运行时间都是O(N), 因为迭代器将有效地从一项到下一项推进。

对搜索而言, ArrayList和LinkedList都是低效的, 对Collection的contains和remove两个方法(它们都以AnyType为参数)的调用均花费线性时间。

在ArrayList中有一个容量的概念, 它表示基础数组的大小。在需要的时候, ArrayList将自动增加其容量以保证它至少具有表的大小。如果该大小的早期估计存在, 那么ensureCapacity可以设置容量为一个足够大的量以避免数组容量以后的扩展。再有, trimToSize可以在所有的ArrayList添加操作完成之后使用以避免浪费空间。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

网管员必读——超级网管经验谈

本书是一本以示例形式直接面向应用的网络管理图书。书中以大量示例和大量实用网络管理与故障排除经验介绍了当前网络管理工作的各主要方面。...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊