Java 中的大头儿子和小头爸爸
Java 中也有一对冤家对头,它们就是字符串 String
和字符 char
。来看看它们的表现吧
System.out.println("h"+"i"); System.out.println('h'+'i');
会打印出什么呢?结果可能出乎你的意料:
hi 209
为什么会出现 209 这个结果呢?
编译器在计算常量表达式 ‘h’+‘i’ 时,是通过我们熟知的拓宽原始类型转换,将两个具有字符型数值的操作数(‘h’和’i’)提升为 int 数值而实现的。从 char 到 int 的拓宽原始类型转换,是将 16 位的 char 数值零扩展到 32 位的 int。对于’h’,char 数值是 104,而对于’i’,char 数值是 105,因此表达式 ‘h’+‘i’ 等价于 int 常量 104 + 105,或 209。
有三种方式避免出现 char 的连接问题。第一种最简单:
System.out.println("" + 'h' + 'i');
第二种:使用函数:
System.out.printf("%c%c", 'h', 'i');
或者:
System.out.println(String.format("%c%c", 'h','i'));
第三种,利用 API 拼装:
StringBuffer sb = new StringBuffer(); sb.append('h'); sb.append('i'); System.out.println(sb);
也许你会认为这比较简单,那我们就见识一个比较复杂点的吧!
private static Random rnd = new Random(); public static void main(String[] args) { StringBuffer word = null; switch(rnd.nextInt(2)) { case 1: word = new StringBuffer('P'); case 2: word = new StringBuffer('G'); default: word = new StringBuffer('M'); } word.append('a'); word.append('i'); word.append('n'); System.out.println(word); }