毕姥爷没说错,但是前提条件是JVM默认的编码规则。需要声明变量类型,如char b ='a'。
我具体说说编码规则对字符占用计算机内存空间的一些影响吧。
一般我们java开发用的jdk中JVM统一使用字符编码规则是UTF—16(Unicode)编码表。所以每次我们声明变量为char类型时候,JVM默认就是2字节。而实际操作时,如果没有声明char类型,一般就会以我们的windows操作系统使用的编码规则为主,表示为:汉字一般是用GBK编码表表示(1个汉字就是2个字节),英文字母一般是用ASCII编码表表示(1个英文字母就是1个字节,ASCII编码表只使用了7个二进制位表示ASCII码值0~255的字符,超出要用别的编码规则)。
对于英文字母的实际占用内存空间确实只有1个字节,至于说2个字节的,完全是编码规则影响,
比如JVM中的UTF-16,对于英文字母在二进制中的高八位是以补0后才有占用2个字节的内存空间的说法。
下面以代码演示一遍:
- 1、
- import java.lang.*;
- class Test6{
- public static void main(String[] args){
- //这里int类型改成byte类型,就可以看到,实际中,
- 英文字母只需要1 个字节的内存空间,使用的就是ASCII码表的规则。
- int c = 'a'+0;
- System.out.println(c);//输出结果为97。
- System.out.println(Integer.toBinaryString(c));}}
- //十进制转换二进制数输出,结果为:1100001 ,可以看出只要1个字节内存空间即可。
- 2、
- import java.lang.*;
- class Test7{
- public static void main(String[] args){
- //这里改成byte类型,明显是损失精度,原因中文汉字是2个字节,
- 使用的规则是Windows的GBK编码表的规则。
- int c = '马'+0;
- System.out.println(c);//输出结果为39532。
- System.out.println(Integer.toBinaryString(c));}}
- //十进制转换二进制数输出,结果为:1001101001101100 ,可以看出只要2个字节内存空间即可。
- 3、
- import java.lang.*;
- class Test8{
- public static void main(String[] args){
- char b ='a';//声明变量b为char类型。
- int c = b+0;
- //这里改成byte类型结果也是损失精度。
- 原因char类型是占用2个字节内存空间,JVM默认的编码规则为UTF-16。
- System.out.println(c);//输出结果为97。
- System.out.println(Integer.toBinaryString(c));}}
- //十进制转换二进制数输出,结果为:1100001 ,可以看出只要1个字节内存空间即可,实际为2个字节,高八位补0。
复制代码
(你只要了解就可以了,不必太纠结这个char类型和英文字母内存问题,加油吧!少年!)
如有疑问可查询:帮助资料地址: http://hi.baidu.com/leifenglian/item/7e25a9194da0e7751009b5e8 |