什么是java的Compact Strings特性,什么情况下使用

简介: Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。

在Java 9中引入了紧凑字符串(Compact Strings)特性,用来优化字符串的内存使用。简单来说,Java改进了字符串的存储方式,将之前的UTF-16字符数组改为字节数组,使得字符串能根据内容使用更节省内存的编码方式。以下是这个特性的核心内容:

什么是紧凑字符串

  1. 内部结构
  • 在Java 8及之前,字符串是用char[]字符数组存储的,每个字符占两个字节(UTF-16编码)。
  • Java 9开始,字符串改为byte[]字节数组。对于只包含Latin-1(ISO-8859-1)字符的字符串,每个字符只需一个字节;若包含其他字符则仍使用两个字节(UTF-16)。
  1. 编码标识
  • Java 9中的每个字符串对象都有一个编码标识(coder),用于指示当前字符串的编码方式:
  • LATIN1(值为0):只包含Latin-1字符。
  • UTF16(值为1):包含其他字符(如中文)。
  1. 内存优化
  • 因为大多数字符串仅含Latin-1字符,这一特性大幅减少内存占用,一般能节省10%到15%的内存,降低垃圾回收的频率。

示例代码

以下代码展示了紧凑字符串的存储方式:

java

代码解读

复制代码

public class CompactStringExample {
    public static void main(String[] args) {
        String latinString = "Hello"; // 仅包含Latin-1字符
        String utf16String = "你好"; // 包含UTF-16字符

        // 打印每个字符串的内部字节数组长度
        System.out.println("Latin String Length: " + latinString.getBytes().length); // 输出5
        System.out.println("UTF-16 String Length: " + utf16String.getBytes().length); // 输出6
    }
}

分析

  • latinString仅包含ASCII字符,因此会被存储为一个5字节的数组。
  • utf16String包含中文字符,每个字符用两个字节表示,因此存储为6字节的数组。

如何判断字符串是否使用紧凑模式

可以使用反射或调试工具查看字符串对象的coder字段:若coder为0,则该字符串使用紧凑模式;若为1,则使用UTF-16。

总结

Java 9的紧凑字符串特性通过优化字符串存储方式,减少了内存占用,并提高了程序性能。这一特性默认启用,帮助开发者在处理大量文本时获得更高效的内存使用。


转载来源:https://juejin.cn/post/7436691610371522569

相关文章
|
4月前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
|
7月前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
104 9
|
7月前
|
Java
|
7月前
|
存储 机器学习/深度学习 Java
【Java SE语法篇】6.数组
【Java SE语法篇】6.数组
|
7月前
|
机器学习/深度学习 Java 编译器
【Java SE语法篇】5.方法
【Java SE语法篇】5.方法
|
7月前
|
安全 Java 编译器
【Java SE语法篇】1.初始Java
【Java SE语法篇】1.初始Java
|
7月前
|
Java C++
Java中的Pair
Java中的Pair
64 0
|
SQL Java
Java(JDK)13新特性之Text Blocks块
Java(JDK)13新特性之Text Blocks块
205 0
|
存储 算法 Java
【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(上)
【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(上)
|
Java API Apache
【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(下)
【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(下)
【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(下)