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

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);
  }
}

看来这是一个可行的解决方案,但出于某种原因,我怀疑String的后备数组是私有的。这种方法有哪些潜在问题?

最佳答案

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

如果仅阅读char[],并且正在为OpenJDK Java 7 Update 6编码,则不会引入任何错误。

另一方面,全球95%的Java程序员可能会对怀疑String内部结构的代码不敢相信,所以要小心:)

07-24 21:16