陷阱8 鱼龙混杂——为字符串缓存构造器传递字符
在生活当中,有许多东西是不允许有任何偏差的,否则就会造成无法挽回的后果,比如,上医院买药,差一个字,就有可能成天壤之别,就很有可能危害到病人的生命,所以一定要认真谨慎。
类StringBuffer提供了一些构造方法,可以创建字符串缓冲区对象,用于存储可变的字符序列,其中该类的常用构造方法有如下3个:
· StringBuffer ()
构造一个默认初始容量为16个字符、不带初始字符的字符串缓冲区对象。
· StringBuffer (int capacity)
构造一个具有参数指定的初始容量,但不带初始字符的字符串缓冲区对象。
· StringBuffer (String str)
构造一个由参数指定的初始字符的字符串缓冲区对象。
注意
StringBuffer类没有char型入口参数的构造方法,如果用一个字符作为其构造方法的入口参数,则等同于为其传递了一个int型的入口参数,这个值就是该字符在Unicode表中的位置值,也就是说创建的是一个具有参数指定的初始容量,但不带初始字符的字符串缓冲区对象。
StringBuffer类的错误用法示例:
创建一个初始字符是大写字母H的字符串缓冲区对象,并依次为该对象追加小写字母e、l、l和o,使其能输出字符串 "Hello" 。
StringBuffer sbuffer = new StringBuffer (' H'); // 创建字符串缓冲区对象 sbuffer. append ("e"); // 为字符串缓冲区对象追加一个小写字符e sbuffer. append ("l"); // 为字符串缓冲区对象追加一个小写字符l sbuffer. append ("l"); // 再为字符串缓冲区对象追加一个小写字符l sbuffer. append ("o"); // 为字符串缓冲区对象追加一个小写字符o String s = new String (sbuffer); // 将字符串缓冲区转换为字符串 System. out. println (s); // 输出字符串
说明
运行上面的程序,其输出的是字符串 "ello" ,并不是期望的字符串Hello,这是为什么呢?原因在于第一条语句,因为StringBuffer类并没有提供一个char型入口参数的构造方法,所以在这里自动将char型参数,即字符H转换为整数值72,也就是创建了一个初始容量为72,但没有初始字符的字符串缓冲区,所以字符串缓冲区中并没有存储字符H,因此输出了字符串 "ello" 。
编程准则:知识点要准确,不要模棱两可
在编写程序时,对于任何一条语句都要保证知识点准确,即使是一条变量声明语句,如果有错误,也可能会给整个系统、给用户造成严重的经济损失,因此对于模棱两可的知识,一定要弄清楚后再确定是否使用,如在上面的示例中,如果StringBuffer对象存放的是药品名称或其他重要信息,后果就不堪设想了。
将上面示例的代码修改正确:
StringBuffer sbuffer = new StringBuffer ("H"); // 创建字符串缓冲区对象 sbuffer. append ("e"); // 为字符串缓冲区对象追加一个小写字符e sbuffer. append ("l"); // 为字符串缓冲区对象追加一个小写字符l sbuffer. append ("l"); // 再为字符串缓冲区对象追加一个小写字符l sbuffer. append ("o"); // 为字符串缓冲区对象追加一个小写字符o String s = new String (sbuffer); // 将字符串缓冲区转换为字符串 System. out. println (s); // 输出字符串
说明
运行本示例,程序会输出所期望的字符串 "Hello" ,这是因为StringBuffer 类有String类型入口参数的构造方法,而第一条语句创建了正确的字符串缓冲区对象,其初始内容为字符 "H" ,所以输出了正确的结果。