java~CompactStrings字符压缩技术

概念

在 Java 中,charbyte 类型占用的存储空间是不同的。

  1. char 类型:char 是 16 位无符号的 Unicode 字符类型,用于表示单个字符。在 Java 中,char 类型占用 2 个字节(16 位)的存储空间。

  2. byte 类型:byte 是 8 位有符号整数类型,表示范围在 -128 到 127 之间的整数。在 Java 中,byte 类型占用 1 个字节(8 位)的存储空间。

需要注意的是,虽然 charbyte 在 Java 中分别占用不同的存储空间,但它们表示的数据类型和范围也是不同的。char 用于表示字符,而 byte 用于表示整数。在处理数据时,应根据具体的需求和数据类型选择合适的类型。

char(0~65535)

char 在 Java 中占用 2 个字节(16 位)的空间是因为 Java 使用的是 Unicode 字符编码,其中字符的表示范围为 0 到 65535(即 2^16-1)。

Unicode 是一种国际标准字符集,为世界上几乎所有的字符分配了唯一的标识符。它包含了各种语言的字符、符号、表情等。为了能够表示这么多的字符,Java 选择了使用 2 个字节(16 位)来存储 char 类型。

Java 的 char 类型使用的是 UTF-16 编码,它是一种可变长度的编码方式,可以使用 2 个字节来表示大部分的字符,但对于一些特殊字符(如表情符号),可能需要使用额外的代码点进行编码。

需要注意的是,Unicode 字符集实际上定义了超过 65536 个字符。为了表示超出 65535 的字符,Unicode 使用了一种扩展编码方式,称为 UTF-16 编码。UTF-16 编码使用了一种叫作代理对(Surrogate Pair)的技术,将一个字符表示为两个 char 类型的编码单元。

因此,虽然 char 类型的范围是 0 到 65535,但实际上可以表示更多的字符。在处理 Unicode 字符时,需要特别注意代理对的处理,以确保正确地处理和显示字符。

byte(-128~127)

在 Java 中,byte 是一个基本数据类型,用于表示 8 位的有符号整数。它的取值范围为 -128 到 127。

byte 类型通常用于处理字节数据,例如读取和写入二进制文件、网络传输中的字节流、加密算法等。由于 byte 类型占用的空间较小,因此在需要节省内存或处理字节级数据的情况下,经常使用 byte 类型。

以下是一些关于 byte 类型的特点和用法:

  1. 取值范围:byte 类型的取值范围为 -128 到 127。可以通过 Byte.MIN_VALUEByte.MAX_VALUE 常量来获取最小值和最大值。

  2. 内存占用:byte 类型占用 1 个字节(8 位)的存储空间。

  3. 字节操作:byte 类型适用于处理字节级数据,例如读取和写入二进制文件、网络传输中的字节流等。可以使用输入输出流、缓冲流等类来读写 byte 数据。

  4. 数组:可以创建 byte 数组来存储一组字节数据。例如,byte[] data = new byte[10]; 创建了一个长度为 10 的 byte 数组。

  5. 类型转换:byte 类型可以与其他整数类型进行相互转换。可以使用类型转换运算符(如 (byte) value)将其他整数类型转换为 byte 类型,或者将 byte 类型转换为其他整数类型。

需要注意的是,在进行 byte 类型的运算时,会发生整数提升。也就是说,byte 类型的操作数会先被提升为 int 类型,然后进行运算。

byte a = 10;
byte b = 20;
byte c = (byte) (a + b);  // 需要进行类型转换

总而言之,byte 类型在 Java 中是用于表示 8 位有符号整数的数据类型,适用于处理字节级数据和节省内存的场景。

java9对字符串存储的优化Compact Strings(紧凑字符串)

Java 9 对字符串的优化主要集中在字符串存储和处理方面,引入了一项被称为 Compact Strings(紧凑字符串)的改进。Compact Strings 的目标是减少字符串在内存中的占用空间,提高性能和效率。

在 Java 8 及之前的版本中,字符串内部使用 char 数组来存储字符数据,并使用额外的 int 型字段记录字符串的偏移量和长度。这种表示方式在包含大量 ASCII 字符的字符串中会造成空间浪费,因为每个字符仍然占用 2 个字节的存储空间。

Java 9 引入了 Compact Strings 的概念,对于仅包含 Latin-1 字符集(即 Unicode 编码范围在 U+0000 至 U+00FF 之间)的字符串,使用字节数组存储数据,每个字符只占用 1 个字节。这样可以大大减少这类字符串的内存占用。对于包含非 Latin-1 字符的字符串,仍然使用 char 数组存储数据,每个字符占用 2 个字节。

Compact Strings 的优化带来了两个主要的好处:

  1. 内存占用减少:对于仅包含 Latin-1 字符的字符串,在内存中占用的空间减少一半,从而可以降低内存消耗。

  2. 性能提升:减少了字符串的内存占用,可以减少内存的分配和垃圾回收的频率,从而提高了性能和效率。

需要注意的是,Compact Strings 仅适用于字符串对象的内部表示方式,对于开发者来说,字符串的使用方式和 API 并没有变化。开发者无需对现有的代码进行修改,可以继续使用字符串相关的方法和操作。

这项优化是在底层实现层面上进行的,旨在提高 Java 运行时的性能和内存利用率,使开发者能够更高效地处理字符串数据。

-XX:+CompactStrings

在 Java 命令行启动时,可以通过使用 -XX:+CompactStrings 参数来开启 Compact Strings。该参数告诉 Java 虚拟机在启动时启用紧凑字符串(Compact Strings)优化。

以下是使用 Java 命令行启动并开启 Compact Strings 的示例:

java -XX:+CompactStrings -jar YourJarFile.jar

在上述示例中,-XX:+CompactStrings 参数指示 Java 虚拟机开启 Compact Strings 优化。-jar YourJarFile.jar 部分是指定要执行的 JAR 文件。

请注意,Compact Strings 优化是默认开启的,可以在不使用 -XX:+CompactStrings 参数的情况下自动启用。但如果需要明确指定开启或禁用 Compact Strings,可以使用相应的命令行参数。