先看jdk8源码:
jdk8 string源码.png
可以看出:
-
String类由final修饰,不可以被继承
-
底层是由char数组实现的
-
value用final修饰,不能修改value的引用地址(value不可变)
-
private修饰和成员变量没有提供setter接口,保证了不可以通过外部接口来修改String的值
-
在JDK9中,将底层的char[]数组改为了byte[]数组存储。
原因:char类型是2字节的,使用 char[] 来表示 String 就导致了即使 String 中的字符只用一个字节就能表示,也必须占用两个字节。但是在实际使用中,只用单字节字符的频率远高于双字节字符,节省字符串的占用空间。
仅仅将char[]数组存储修改为byte[]数组存储是远远不够的,jdk9中还配合了 Latin-1 的编码方式的编码方式( Latin-1:用单字节表示字符)。对于双字节字符使用UTF16的编码方式表示。因此在jdk9的String源码中引入了coder字段区分编码方式。
private final byte coder;
Java 会根据字符串的内容自动设置为相应的编码,要么 Latin-1 要么 UTF16。
网友评论