作者:王晓华,GitChat 优秀作者
为什么会有这篇文章?
无论是七、八年前开始写的 “算法博客”,还是三年前出版的图书《算法的乐趣》,亦或是畅销课《算法应该怎么玩》,我介绍算法用的例子都是用 C++ 编写的。
尽管以前博客的留言里不乏抱怨之声,但是在《算法的乐趣》出版的时候我仍然 “一意孤行” ,最终招致读者吐槽:“好好的一本算法书,为什么要用 C++?”
我的很多使用 Java 的朋友们也都为我 “打抱不平”,但是在事实面前,我不得不承认,这个拖了很久的需求必须要实现了。
尽管学习 Java 了很长时间,但是因为工作的需要,很少用 Java 做过大型的项目,所以在公开算法实现的时候,我本能地选择最擅长的 C++ 语言。
事实上,我在编写《算法应该怎么玩》的过程中,参考资料里有不少 Java、Python 实现的算法,原理都是相通的,用何种编程语言实现只是对外展示的一张皮而已。
作为一个 Java 程序员时,经常会遇到 C++ 算法代码,有时候没有更好的替代例子的情况下,还必须得啃一啃 C++。
往好处想,虽然 C++ 涉及的内容广泛,但是算法上能用到的部分并不多,都是一些基本语言元素,短时间内了解一下 C++ 相关的内容,能够看懂小段的 C++ 代码是完全有可能的。
接下来,我会在算法涉及的层面上,比较一下 C++ 和 Java 上的差异,通过这些对比和比较,Java 程序员能快速理解 C++ 算法实现的例子,C++ 程序员也能看懂简单的 Java 算法代码。
PS:
两种语言的对比会放在一起展示,如不做特殊说明,上面的代码是 C++ 的实现方式,下面的是 Java 的实现方式。
此外,C++ 语法层面使用的版本是 C++11之后的版本,Java 使用的标准是 Java6 之后的版本。
C++ 和 Java 语法特性的相似性
因为历史原因,同为 C 语言家族的 Java 和 C++ 语言层面的相似性是有客观基础的。
我通常是这样理解的:Java 是跨平台的 C++,是一种更好的 C++(是不是有点拉仇恨的感觉)。
基本数据类型
C++ 的基本数据类型有:int、unsigned int、long、unsigned long、short、unsigned short、char、unsigned char、bool、float 和 double;
相应的,Java 也有 8 种基本数据类型,分别是:byte、short、int、long、float、double、char 和 boolean。
大部分情况下,两种语言的基本数据类型可以根据下表进行一对一的转换,但是也有差异,需要特别注意。
首先是 char,C++ 的 char 是 8 比特无符号整数,顺便表示了 ASCII 字符;Java 的 char 是 16 比特,天生就可以表示宽字符集的字符。
另一个需要注意的是 long 类型,C++ 的 long 是不可移植类型,在不同的系统上其长度不一样,可能是 32 位,也可能是 64 位,所以 C++ 程序员应尽量避免使用 long。
Java 的 long 比较单纯,无论是 32 位的系统还是 64 位的系统,它都表示 64 位整数。
反过来,Java 会用 d 或 D 表示一个直接数字是 double 类型的浮点数,比如 200.0d 或(200.0D),但是 C++ 不支持,因为 C++ 默认一个浮点型的直接数字就是 double 类型。
C++ 用字面量符号 f 或 F 表示一个直接数字是 float 类型浮点数,比如 250.1 f(或 250.1F),这一点 Java 也是一样的。
C++ 用字面量符号 l 或 L 表示 long,用 UL 表示 unsigned long。
字符串
很多 C++ 程序员喜欢的用 char* 或 char 类型的数组存储字符串,这其实是 C 语言用户带过来的习惯,我给出的 C++ 算法实现对字符串一般都用 std::string'
,对应 Java 的 String。
std::string
和 String
的用法对照如下表所示:
基本语法
虽然 Java 的语法和 C++ 十分地相似,但是语言层面还有一些不同。C++ 允许全局函数的存在,但是 Java 不允许,不过 Java 也留了个口子,就是用静态成员函数。
Java 没有指针,对象的传递和返回都是用的引用的方式,并且不需要像 C++ 那样用 “&a