文章目录
1 概述
抽象数据类型(abstract data type, ADT)是带有一组操作的一些对象的集合。
本篇文章主要介绍三种最基本的数据结构:表 ADT , 栈 ADT , 队列 ADT。
2 表 ADT
2.1 预先知识
2.1.1 Collection 接口
Collection API 位于 java.util接口。集合的概念在Collection 接口中得到抽象,它存储一组类型相同的对象。
Collection 接口拓展了 Iterable 接口。实现 Iterable 接口的那些类可以拥有增强的 for循环,该循环施于这些类上以观察它们所有的项。
2.1.2 Iterator接口
Iterator 接口包含 remove 方法,该方法可以删除next 最新返回的项(此后,我们不能再调用remove , 直到对next 再一次调用以后)
当直接使用 Iterator(而不是通过一个增强的 for 循环间接使用)时,重要的一点:如果对正在被迭代的集合进行结构上的改变(即对该集合使用add 、remove 或 clear方法),那么该迭代器就不再合法(并且在其后使用该迭代器时将会有 ConcurrentModificationException 异常被抛出),但是如果迭代器调用了它自己的remove方法,那么该迭代器就依然是合法的,这是Iterator 的 remove方法的一个主要优点。
Iterator 的 remove 方法的主要优点还在于,Collection 的 remove 方法必须首先找出要被删除的项。而Iterator 的 remove 方法事先知道了要删除的项的准确位置,那么删除它的开销就会小很多。
2.2 List 表 的数组实现(ArrayList)
ArrayList 类提供了 List ADT 的一种 可增长数组的实现。
优点:
- 对于 get 和 set 的调用花费常数时间;
缺点:
- 新项的插入和现有项的删除代价昂贵,除非变动时在 ArrayLis的末端进行。
对于搜索,ArrayList 和 LinkedList都是低效的。
对于ArrayList 删除和插入都可能会移动其余项,造成巨大的代价。
2.3 List 表 的列表实现(LinkedList)
LinkedList 是 双向链表;
优点:
- 新项的插入和现有项的删除均开销很小(假设变动项的位置是已知的),在表的前端进行添加和删除是常数时间的操作;
缺点:
- 它不容易索引,因此对get的调用是昂贵的,除非调用非常接近表的端点。