Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

陷阱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" ,所以输出了正确的结果。