面试题答案
一键面试存储结构差异
- Java 8:
String
类使用char
数组来存储字符串内容。例如:
public final class String {
private final char value[];
}
这种存储方式意味着每个字符占用2个字节(因为char
是16位的),对于纯ASCII字符会造成空间浪费。
- Java 9:
String
类改用byte
数组存储字符串,并新增一个coder
字段来标识编码方式。代码示例如下:
public final class String {
private final byte[] value;
private final byte coder;
}
如果字符串仅包含Latin - 1字符(即ASCII范围),coder
值为0,每个字符用1个字节存储;否则coder
值为1,每个字符用2个字节存储,以UTF - 16编码方式存储。
性能优化差异
- Java 8:在处理仅包含ASCII字符的字符串时,由于
char
数组每个字符占用2字节,在内存和处理速度上会存在一定性能损耗。比如在读取、写入、比较等操作时,处理的数据量相对更大。 - Java 9:对于大量仅包含Latin - 1字符的字符串,由于采用
byte
数组存储且单字节存储字符,内存占用减少,在字符串操作(如拼接、比较等)时性能有所提升。例如在频繁进行字符串拼接操作时,减少了内存分配和复制的开销。
对应用程序的影响
- 内存占用:如果应用程序处理大量仅包含Latin - 1字符的字符串,Java 9的存储方式会显著降低内存占用。例如在处理日志记录、文本解析等场景中,可减少内存压力,降低垃圾回收频率,提高应用程序整体性能。
- 兼容性:Java 9中
String
底层实现的改变,对于大多数应用程序透明,因为String
的API没有变化。但对于通过反射等方式直接访问String
内部结构的代码,可能需要修改以适应新的存储结构。比如一些依赖于String
内部char
数组的自定义序列化逻辑,需要调整为适应byte
数组和coder
字段。