编码问题存在两个方面:JVM之内和JVM之外。
1、Java文件编译后形成class
这里Java文件的编码可能有多种多样,但Java编译器会自动将这些编码按照Java文件的编码格式正确读取后产生class文件,这里的class文件编码是Unicode编码(具体说是UTF-16编码)。
因此,在Java代码中定义一个字符串:
String s="汉字";
不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的: Unicode编码表示。
2、JVM中的编码
JVM加载class文件读取时候使用Unicode编码方式正确读取class文件,那么原来定义的String s="汉字"; 在内存中的表现形式是Unicode编码。
ASCII码: 一个英文字母(不分大小写)占一个字节,一个中文汉字占两个字节。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制,最小值0,最大值255。
UTF-8编码: 一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。 (utf-8的mysql库 VARCHAR2(32) 能支持32个中文, length() 是 96。)
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
boolean false/true(理论上占用1bit, 1/8字节,实际处理按1byte处理)
byte: 1个字节占8位。 如果有正负则-128到127;否则0~256.
char :2个字节
short : 2个字节
int: 4个字节
float: 4个字节
double: 8个字节
long: 8个字节