在书中的这个问题,其实是要说明 Java API 中存在一些不能通过名称来准确辨识行为的方法,这可能导致误用。用户在使用不熟悉的函数(方法)时,要注意查询 API 文档,仔细了解方法的含义,不要望文生义。
书中举出了两个方法:
String.replace(String, String)
String.replaceAll(String, String)
假如没任何说明文档,我们可能认为它们其实是一样的。在具体使用中,一般也是一样的,但有例外:
String hello = "hello.world.Puzzle21";
hello.replaceAll("\\.", File.separator);
以上代码在 Windows 平台上运行将报错。因 Windows 上的 File.separator \ 同时也是转义标识符号,程序运行时,对 \ 后的字符进行转义处理,遂报错。String.replaceAll 将参数视作某种表达式,用以支持正则表达式运算,结果引入了这个问题。
而用下面的代码,是可以的:
String hello = "hello.world.Puzzle21";
hello.replace("\\.", File.separator);
如果在 Windows 上运行,将正常输出:
hello\world\Puzzle21
这是因为 String.replace 方法,将两个参数都按照字面含义的字符串来处理。这个方法不支持正则表达式。
附: