算法(第4版)-1.2.5 数据类型的设计

总结:本小节讲述了关于设计数据类型的重要知识,包括封装、设计API、算法与抽象数据类型的关系、接口继承、实现继承、等价性、内存管理、不可变性、异常与错误等知识。(“简单看来,下面的许多话题和算法的学习关系不大,因此你可以跳过本节,在今后实现抽象数据类型中遇到特定问题时再回过头来参考它。”)

重点:

1. 设计一份优秀的API所付出的所有时间都能从调试和代码复用所节省的时间中获得回报。

2. 在本书中,算法一般都是某个抽象数据类型的一个实例方法的实现。

3. 在本书中我们会避免使用子类继承,因为他会破坏封装。

4. Java约定equals()必须是一种等价性关系。它必须具有:

  · 自反性,x.equals(x)为true;

  · 对称性,当且仅当y.equals(x)为true时,x.equals(y)返回true;

  · 传递性,如果x.equals(y)和y.equals(z)均为true,x.equals(z)也将为true。

另外,它必须接受一个Object为参数并满足以下性质:

  · 一致性,当两个对象均未被修改时,反复调用x.equals(y)总是会返回相同的值;

  · 非空性,x.equals(null)总是返回false。

5. 可以使用下面的实现作为实现任意数据类型的equals()方法的模版:

public class Date {
    private final int month;
    private final int day;
    private final int year;

    public Date(int m, int d, int y) {
        month = m;
        day = d;
        year = y;
    }

    public boolean equals(Object x) {
        if (this == x)    return true;
        if (x == null)    return false;
        if (this.getClass() != x.getClass())    return false;
        Date that = (Date) x;
        if (this.day != that.day)    return false;
        if (this.month != that.month)    return false;
        if (this.year != that.year)    return false;
        return true;
    }
}

6. Java最重要的一个特性就是自动内存管理。它通过记录孤儿对象并将它们的内存释放到内存池中,将程序员从管理内存的责任中解放出来。这种回收内存的方式叫做垃圾回收。

7. 不可变性的另一个缺点在于,final非常不幸地只能用来保证原始数据类型的实例变量的不可变性,而无法用于引用类型的变量。如果一个应用类型的实例变量含有修饰符final,该实例变量的值(某个对象的引用)就永远无法改变了--它将永远指向同一个对象,但对象的值本身仍然是可变的。例如,这段代码并没有实现一个不可变的数据类型:

public class Vector {
    private final double[] coords;

    public Vector(double[] a) {
        coords = a;
    }

    ...
}

用例程序可以通过给定的数组创建一个Vector对象,并在构建函数执行之后(绕过API)改变Vector中的元素的值:

double[] a = {3.0, 4.0};
Vector vector = new Vector(a);
a[0] = 0.0; // 绕过了公有API

8. 任何数据类型的设计都需要考虑到不可变性,而且数据类型是否是不可变的则应该在API中说明,这样使用者才能知道该对象中的值是无法改变的。

9. 默认设置没有启动断言,可以在命令行下使用 -enableassertions 标志(简写为-ea)启动断言。断言的作用是调试:程序在正常操作中不应该依赖断言,因为他们可能会被禁用。系统编程课程会学习使用断言来保证代码永远不会被系统错误终止或是进入死循环。(?)

10. 如果你总是抱怨编程语言的特性,那么你只能自己设计编程语言了。(霸气!)

时间: 2024-10-11 22:05:16

算法(第4版)-1.2.5 数据类型的设计的相关文章

算法(第四版)学习笔记之java实现选择排序

选择排序步骤: 1.找到数组中参与遍历比较的所有元素中的最小元素的下标: 2.将最小元素与数组中参与遍历比较的第一个元素进行交换(如果第一个元素就是最小元素的话,那么也会进行一次交换): 3.若数组中还有需要参与遍历比较的元素,则跳转到步骤1:否则排序结束. 在算法第四版中给出的所有排序均是适用于任意实现了Comparable接口的数据类型,若要将数字作为测试用例,请勿使用基本数据类型,改用Integer等实现了Comparable接口的对象. 选择排序代码如下: /** * * @author

算法第四版-文字版-下载地址-Robert Sedgewick

下载地址:https://download.csdn.net/download/moshenglv/10777447 算法第四版,文字版,可复制,方便copy代码 目录: 第1章 基 础 ....................... . ..........................11.1 基础编程模型 ..................................... 41.1.1 Java程序的基本结构 ................. 41.1.2原始数据类型与表达式

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

算法第四版 在Eclipse中调用Algs4库

首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File -> New Java Project,项目名随便写,如下图 右键src文件夹,Add -> New Java Class,这里需要注意Name一栏里填写的内容就是类名,这里我写了TestAlgs4,为了测试「算法 第四版」作者给的那个测试样例 代码如下: import edu.princeto

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位

可视化对比十多种排序算法(C#版)

本文由 伯乐在线 - smilesisi 翻译自 Kanasz Robert.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 在这篇文章中,我会向大家展示一些排序算法的可视化过程.我还写了一个工具,大家可对比查看某两种排序算法. 下载源码 – 75.7 KB 下载示例 – 27.1 KB 引言 首先,我认为是最重要的是要理解什么是“排序算法”.根据维基百科,排序算法(Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法.最常用到的排序方式是数值顺序以及字典

常见排序算法(JS版)

常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>twobin 常见排序算法 (JS版) </title> 5 <meta http-equiv="content-type" content=&

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

图灵程序设计丛书 算法(第4版)pdf

下载地址:网盘下载 内容简介  · · · · · · 本书全面讲述算法和数据结构的必备知识,具有以下几大特色. ? 算法领域的经典参考书 Sedgewick畅销著作的最新版,反映了经过几十年演化而成的算法核心知识体系 ? 内容全面 全面论述排序.搜索.图处理和字符串处理的算法和数据结构,涵盖每位程序员应知应会的50种算法 ? 全新修订的代码 全新的Java实现代码,采用模块化的编程风格,所有代码均可供读者使用 ? 与实际应用相结合 在重要的科学.工程和商业应用环境下探讨算法,给出了算法的实际代