微资讯!java~CompactStrings字符压缩技术

来源:博客园 时间:2023-06-26 17:06:22

概念

在 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,可以使用相应的命令行参数。

X 关闭

微资讯!java~CompactStrings字符压缩技术

概念在Java中,`char`和`byte`类型占用的存储空间是不同的。1 `char`

2023-06-26

海纳百川有容乃大下一句是什么_海纳百川有容乃大下一句-环球通讯

1、海纳百川,气度大。下一句是“千里壁立,无欲则刚”。意思是海足够

2023-06-26

没选皇马和纽卡!利物浦190球锋霸,去沙特跟C罗争冠军 每日视点

菲尔米诺将那名牙医视为他人生中的第一个经纪人,因为马塞勒斯-波尔特

2023-06-26

看热讯:走了一万一千里路适合几年级看(走了一万一千里路)

来为大家解答以上的问题。走了一万一千里路适合几年级看,走了一万一千

2023-06-26

天天新消息丨潭阳社区:赓续红色血脉,汲取奋进力量

为庆祝中国共产党建党102周年,深入推进“一月一课一片一实践”主题活

2023-06-26

视点!学校是否也要有一个“社委会”

在学校、家庭及社会三方的教育合作中,学校是专业的教育组织,以学校为

2023-06-26

环球观焦点:生物制药行业蓬勃发展,正为上游药机企业带来巨大发展机遇!

生物制药行业蓬勃发展,正为上游药机企业带来巨大发展机遇!,  据了

2023-06-26

南阳师范学院河南省近三年普通本专科录取分数线-热门

南阳师范学院河南省近三年普通本专科录取分数线2022年:2021年:2020年

2023-06-26

TCL:敢为上游不畏难

已经航行了42年,但TCL的故事,绝不是顺风顺水。从磁带起家到电话机称王,从做电视、手机等硬件单品到拓展全场景智能终端,从收购汤姆逊彩

2023-06-26

十二烷基苯磺酸三乙醇胺盐商品报价动态(2023-06-26) 世界速读

交易商品牌 产地交货地最新报价十二烷基苯磺酸三乙醇胺盐 液体40%含量

2023-06-26

Copyright ?  2015-2022 华中科技网版权所有  备案号:京ICP备12018864号-26   联系邮箱:2 913 236 @qq.com