【问题标题】:Impossible to create String from char[] without copying it?不复制就不可能从 char[] 创建字符串?
【发布时间】:2022-01-11 21:09:40
【问题描述】:

有没有办法从 char[] 创建一个字符串而不复制它?

从下面的截图中可以看到(取自 JDK 1.8 中的 String 类):

实现这一点的构造函数是私有的且不可访问。也许有任何解决方法?因为我需要不复制 char[] 来提高性能。

对于上下文:我正在研究 YAML/DYML 解析器,其中每百分之一毫秒都很重要。这是代码(它的 WIP):https://github.com/Osiris-Team/Dream-Yaml/blob/main/src/main/java/com/osiris/dyml/DYReaderV2.java

【问题讨论】:

  • 没有。因为String 是不可变的。您也许可以针对char[] 实施CharSequence - 例如docs.oracle.com/javase/8/docs/api/java/nio/…
  • @OsirisTeam 你认为这是为什么?这是“秘方”。我可以把秘制酱汁放在你的汉堡上,但我永远不会告诉你怎么做。这是一个包私有方法。只有java.lang 包的成员才有足够的权限访问该构造函数。或者,您可以通过调用可以在内部访问它的公共构造函数来获取结果。
  • 如果您充分解释您的情况,可以建议适当的解决方案。挂在不适合您使用的构造函数上是没有用的。您如何获取数据,您将其用于什么用途(即您是否需要将其作为 String 而不是例如流式解决方案)。
  • 您采用了哪些性能指标来确定这个特定的 String 构造函数是您的问题?如果此处的更改比更仔细地使用 List、Map、数据库或文件操作产生更大的影响,那将是令人惊讶的。
  • 不要向我们展示您的代码的屏幕截图。将代码复制并粘贴到问题中作为文本

标签: java arrays string utf-8


【解决方案1】:

简单地说答案是否定的,这很糟糕。

然而,有一些合理的解决方法:

  • 通过 Java 反射 API 公开私有 String 构造函数
  • 创建自定义 JVM 发行版,将私有构造函数更改为公共

更合理的选择是:

  • 直接使用 char[]
  • 改用 CharSequence 或 CharBuffer

感谢 cmets 的所有帮助。

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2018-03-18
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多