HashMap和hash函数也是剥离的,但使用了另一种思路。在Java中,根类型Object定义了hashCode()和equals()方法,由于任何类型的对象都派生自Object,所以它们都自动继承了这两个方法。用户自定义的类应该重载这两个方法,以实现自己的hash函数和比较函数。如果这两个函数没有被重载,Java会使用Object的hashCode()和equals()方法,它们的默认实现分别是返回对象的地址,以及比较两个对象的地址是否相等。
在PHP中,数组和Hash表合而为一了。从语法上看,PHP中并没有Hash表这样的容器,而只支持数组。不同的是,PHP中的数组不但支持使用数字下标进行索引,而且支持使用字符串下标进行索引。换句话说,PHP中的数组支持使用键-值对作为数组的元素,并且可以使用键来进行索引(键必须为integer类型或string类型)。而且,PHP中的数组支持自动增长和嵌套。如下例:
$arr = array(1 => 12, "akey" => "this is a word");
echo $arr[1]; // 得到12
echo $arr["akey"]; // 得到"this is a word"
PHP没有提供自定义hash函数的接口。由于它不接受integer和string以外的类型作为键,这一点事实上也没有必要。
结束语 当接受这篇文章的约稿时,我认为这是一项比较简单的工作。因为这三种数据结构实在是太基础了,所以我甚至怀疑是否能够写出足够长的篇幅。很快我就发现了自己的错误。光是字符串就够写一本书的。
在撰写本文的过程,我回顾了学习过的大部分编程语言,重温了许多经典书籍中的相关章节,启动了各种IDE编写测试用例。我接触到了大量未知的领域,至今我仍然在猜测许多问题的实现细节。这从另外一个方面说明了基本数据结构的重要性:即使在我们最熟悉的事物中,也隐藏着极为深刻的原理。
参考文献: K&R,C程序设计语言,第二版
Bjarne Stroustrup,C++程序设计语言,第三版
Koenig & Moo,C++沉思录
Delphi Language Guide
Bruce Eckel,Thinking in Java,第二版
McLaughlin & Flanagan,Java 5.0 Tiger程序高手秘笈
Jesse Liberty,Programming C#
W. Gilmore,PHP与MySQL 5程序设计
Lutz & David Ascher,Learning Python,第二版
Alex Martelli,Python in a Nutshell,第二版
Introduction to Algorithms,第二版
殷人昆等,数据结构(用面向对象和C++描述)
Joel Spolsky,Joel说软件
查看本文来源