1.String
底层在JDK9
以后使用字节数组来存储字符串,在JDK8
及以下使用char[]
来存储字符串。并且均被final
修饰
- 为什么要修改字符为字节?节省空间,字符占据两字节,字节占用一个字节
(char是字符,一个字符占两个字节)
2.Java 语言使用 Unicode 字符集,Unicode 为每一个字符都分配的一个唯一的数字,即 这个数字便代表与之对应的字符。
Java中的字符(char)
- 下面的程序打印一个字符 ‘楠’ 字:
public class Temp_3 {
public static void main(String[] args) {
System.out.println('楠');
System.out.println((char)26976);
System.out.println('\u6960');
}
}
运行结果为:
楠
楠
楠
3.Unicode 只是一个字符集,它为每个字符分配一个唯一的数字,从而可以用数字来表达字符,而 UTF-8 是一种编码方式,描述怎样实际存储Unicode 字符对应的数值
4.当变为.class文件时,就可以跨平台使用了(不同平台的使用编码不同),因为已经完成了从UTF-8编码的文件转成与平台无关的.class文件了,也就是说已经把根据UTF-8编码方式转成了Unicode。
5.Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“楠”的Unicode是U+6960。而26976即为十进制。
UTF-8
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
-
对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
-
对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
编码规则:
对于具体的Unicode编号,进行UTF-8编码的方法:
首先找到该Unicode编号所在的编号范围,进而找到对应的二进制格式,然后将该Unicode编号转换为二进制数有(去掉高位的0)最后将该二进制数一次填充入二进制格式的X中,未填充的X变为0.
例:马的Unicode编号是:0x9A6C,整数编号是39532,其格式为:1110XXXX 10XXXXXX 10XXXXXX,39532对应的二进制为1001 1010 0110 1100,填入为:11101001 10101001 10101100