java~CompactStrings字符压缩技术
概念
在 Java 中,char
和 byte
类型占用的存储空间是不同的。
-
char
类型:char
是 16 位无符号的 Unicode 字符类型,用于表示单个字符。在 Java 中,char
类型占用 2 个字节(16 位)的存储空间。 -
byte
类型:byte
是 8 位有符号整数类型,表示范围在 -128 到 127 之间的整数。在 Java 中,byte
类型占用 1 个字节(8 位)的存储空间。
需要注意的是,虽然 char
和 byte
在 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
类型的特点和用法:
-
取值范围:
byte
类型的取值范围为 -128 到 127。可以通过Byte.MIN_VALUE
和Byte.MAX_VALUE
常量来获取最小值和最大值。 -
内存占用:
byte
类型占用 1 个字节(8 位)的存储空间。 -
字节操作:
byte
类型适用于处理字节级数据,例如读取和写入二进制文件、网络传输中的字节流等。可以使用输入输出流、缓冲流等类来读写byte
数据。 -
数组:可以创建
byte
数组来存储一组字节数据。例如,byte[] data = new byte[10];
创建了一个长度为 10 的byte
数组。 -
类型转换:
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 的优化带来了两个主要的好处:
-
内存占用减少:对于仅包含 Latin-1 字符的字符串,在内存中占用的空间减少一半,从而可以降低内存消耗。
-
性能提升:减少了字符串的内存占用,可以减少内存的分配和垃圾回收的频率,从而提高了性能和效率。
需要注意的是,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,可以使用相应的命令行参数。