【算法】1.2. 数据抽象

正文

抽象数据类型(ADT)是一种能够对使用者隐藏数据表示的数据类型。使用一种数据类型并不一定非得知道它是如何实现的

1.2.2 抽象数据类型举例

1.2.2.1 几何对象

处理几何对象的程序在自然世界模型、科学计算、电子游戏、电影等许多计算中有着广泛的应用。此类程序的研发已经发展成了“计算几何学”这门影响深远的研究学科。

1.2.2.2 信息处理

无论是需要处理数百万信用卡交易的银行,还是需要处理数十亿点击的网络分析公司,或是需要处理数百万实验观察结果的科学研究小组,无数应用的核心都是组织和处理信息。抽象数据类型是组织信息的一种自然方式。

答疑

  • 为什么要使用数据抽象?它能够帮助我们编写可靠而正确的代码。例如,在 2000 年的美国总统竞选中,Al Gore 在弗罗里达州的 Volusia 县的一个电子计票机上得到了 -16022 张选票——显然电子计票机软件中的选票计数器的封装不正确!
  • 为什么要区别原始数据类型和引用类型?为什么不只用引用类型?因为性能。Java 提供了 Integer、Double 等和原始数据类型对应的引用类型,以供希望忽略这些类型的区别的程序员使用。原始数据类型更接近计算机硬件所支持的数据类型,因此使用它们的程序比使用引用类型的程序运行得更快。
  • 在Java中,创建引用的方法只有一种(new),且改变引用的方法也只有一种(赋值语句)。也就是说,程序员能对引用进行的操作只有创建和复制。在编程语言的行话里,Java 的引用被称为“安全指针”,因为Java能够保证每个引用都会指向某种类型的对象(而且它能找出无用的对象并将其回收)
  • Java 如何实现引用和进行垃圾收集?Java 系统的实现各有不同。例如,实现引用的一种自然方式是使用指针(机器地址);而另一种使用的则可能是句柄(指针的指针)。前者访问数据的速度更快,而后者则能够更好地实现垃圾回收。
  • 继承有什么问题?子类继承阻碍模块化编程的原因有两点。第一,父类的任何改动都会影响它的所有子类。子类的开发不可能和父类无关。事实上,子类是完全依赖于父类的。这种问题被称为“脆弱的基类”问题。第二,子类代码可以访问所有实例变量(不能访问private),因此它们可能会扭曲父类代码的意图。