【问题标题】:Bit level representation of Strings in JavaJava中字符串的位级表示
【发布时间】:2019-12-25 11:56:10
【问题描述】:

我知道字符串是一个字符序列。但它是如何以位级表示的呢?和代表人物一样吗?例如,字符串"ab" 是否表示为0000000001100001 0000000001100010,其中前16 位表示a 的Unicode 编号,后16 位表示b 的Unicode 编号?

【问题讨论】:

  • 也许你应该读到这个:en.wikipedia.org/wiki/Character_encoding
  • 好的,我刚刚发现您可以通过在字符串“\uxxxx\uxxxx”中使用此表示法来使用一些 Unicode 编号高于 \uffff 的字符。因此,您不能将这些字符表示为 char,但您肯定可以将这些字符表示为字符串。那么,任何人都可以为位级表示提供帮助吗?

标签: java string char


【解决方案1】:

但它是如何以位级表示的呢?和代表人物一样吗?

不一定。这取决于您使用的 Java 版本以及其他因素。

  • 在 Java 9 之前,String默认 字符内容表示为 char 的数组。因此,您的示例表示对于 Java 8 及更早版本基本上是正确的。

  • 在 Java 6 和 Java 8 之间,有一个 JVM 选项可以启用“压缩字符串”。对于仅由 ASCII 字符组成的字符串,这使用每个字符 1 个字节。启用此功能的字符串表示使用byte[]char[]

  • 在 Java 9 中,他们引入了“紧凑字符串”支持作为标准。这与“压缩字符串”的作用大致相同,但有一些重要的区别使其成为更有效的优化。 (实际使用的数据类型是byte[]。在字符串中的字符为16位的情况下,每对byte值代表一个char

对于“压缩”和“压缩”字符串,表示将取决于实际字符。对于您的 "ab" 示例,位级表示将是 2 个字节而不是 2 个 16 位字。

您还询问了 String 是否支持大于 U+FFFF 的代码点。答案是肯定的。当使用char[] 表示时(就像它们在这里一样),代码点实际上是用 UTF-16 编码的。这意味着大于 U+FFFF 的代码点表示为两个 16 位代码单元。 (代理对。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多