Java中String的内存高效,低开销替换

时间:2012-08-08 12:11:20

标签: java string memory-efficient

this old question上阅读答案之后,我有点好奇现在知道是否有任何框架,可以存储大号(数百万)小尺寸(15-25个字符长)字符串更多比java.lang.String有效。

如果可能,我想使用byte []而不是char []来表示字符串。

我的String(s)将成为常数&我并不需要java.lang.String类提供的许多实用方法。

2 个答案:

答案 0 :(得分:3)

Java 6使用-XX:+UseCompressedStrings执行此操作,默认情况下会在某些更新中启用。

它不在Java 5.0或7中。它默认仍然列为on,但在Java 7中实际上不支持它。:P

根据你想做什么,你可以编写自己的类,但如果你只有几百MB的字符串,我怀疑它不值得。

答案 1 :(得分:0)

这种优化很可能不值得它带来的努力和复杂性。或者与VM提供给你的东西一样(正如Peter Lawrey建议的那样),或者不遗余力地使用自己的解决方案(不使用java.lang.String)。

您自己的String类可以实现一个CharSequence接口。遗憾的是,很少有JRE方法接受CharSequence,因此如果您需要将任何“字符串”传递给任何其他API,请准备好在您的类中频繁使用toString()。

您还可以 hack String以更高效的内存(以及更少GC友好的方式)创建您的字符串。 String有一个(包访问级别)构造函数String(offset,count,char []),它不复制字符,但只是将char []作为直接引用。您可以将所有字符串放入一个大的char []数组中并使用反射构造字符串,这样可以避免字符串中char []数组通常引入的大量开销。我不能真正推荐这种方法,因为它依赖于JRE私有功能。