作为Java程序员,大家是不是发现自己很少用char,byte,更多的都是用String,StringBuffer,StringBuilder,那么我们为什么要研究char和byte呢?没错,就是空间,内存。。。
问:java char 能否存储一个汉字,为什么?
答:char 类型一般默认占用两个字节,所以能存储中文字符(一个中文字符占用两个字节),所以 char c1 = '我'; 是合法的,而 char c2 = 'ab'; 是非法的,所以 char 类型在内存中占用两个字节空间,但是只能表示一个字符,若是只想表示一个字节的字符可以使用 byte。
问:下面程序段的输出是什么?
答:可能是 2、3、4 之一。因为 getBytes() 方法会根据当前默认的字符编码格式获取字节数组,gbk/gb2312 占 2 位,utf-8 占 3 位,unicode 占 4 位。所以这个问题告诫大家写代码最好指定编码,譬如可以通过 ("GBK"),("UTF-8") 来指定输出。
问:下面程序段的输出是什么?
答:输出 c 和 100。
对于第一个输出来说,char 在 java 中称为字符型,占 2 个字节,而字符常量是用单引号括起的一个字符,而且字符常量在内存中存储的是该字符在 Unicode 字符集中的排序位置(即这里的排序位置为 98,可以 javap 看),所以对于 char n = 'b' 来说就是 char n = 98,而 Sy(++n) 语句会先执行++n,所以为 99,然后输出对应位置的字符,即 c。
对于第二个输出来说,Java 中存在向上兼容的特点(不同类型数据参与运算数据类型会强制转换,转换的方向是 char -> short -> int -> long -> float -> double),所以在 Sy(n+1) 语句中,n 是 char 类型,1 是 int 类型,所以会先把 n 强转成 int,然后运算 99 + 1,所以输出也是 int 类型的 100。