在某些情况下,直接访问字符串的后备数组是否合理?

2024-05-07

我正在致力于优化文本处理软件,其中经常使用以下类:

class Sentence {

  private final char[] textArray;
  private final String textString; 

  public Sentence(String text) {
     this.textArray = text.toCharArray();
     this.textString = text;
  }

  public String getString() {
     return textString;
  }

  public char[] getArray() {
     return textArray;
  } 
}

正如您所看到的,存在一些冗余:textString 的后备数组始终等于 textArray,但两者都被存储。

我希望通过删除 textArray 字段来减少此类的内存​​占用。

有一个问题:这个类在整个代码库中被广泛使用,因此我无法摆脱 getArray() 方法。我的解决方案是去掉 textArray 字段,并让 getArray() 方法通过反射返回 textSting 的支持数组。

结果会是这样的:

class Sentence {

  private final String textString; 

  public Sentence(String text) {
       this.textString = text;
  }

  public String getString() {
     return textString;
  }

  public char[] getArray() {
     return getBackingArrayUsingReflection(textString);
  } 
}

这似乎是一个可行的解决方案,但我怀疑字符串的支持数组是私有的是有原因的。这种方法有哪些潜在问题?


将发生的一件事是您致力于 JDK 的一种特定实现。例如,Java 7 Update 6 完全修改了其对char[]。这就是为什么只有当您的代码非常短暂、基本上是一次性代码时才应该容忍这种方法。

如果您只是阅读char[],并且您正在为 OpenJDK Java 7 Update 6 进行编码,因此不会引入任何错误。

另一方面,世界上 95% 的 Java 程序员可能会摇头表示怀疑,因为代码反映了String内部结构,所以要小心:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在某些情况下,直接访问字符串的后备数组是否合理? 的相关文章

随机推荐