是否将字符串封装为byte []以节省内存过量?(JAVA)

JAR*_*ARC 6 java oop string byte memory-management

最近审查了一些Java Swing代码并看到了这个:

byte[] fooReference;

String getFoo() {
   returns new String(fooReference); 
}

void setFoo(String foo) {
  this.fooReference = foo.getBytes();
}
Run Code Online (Sandbox Code Playgroud)

以上内容可以节省你的记忆足迹,或者我告诉你.

这种矫枉过正的是其他人以这种方式封装他们的字符串吗?

Jon*_*eet 31

这是一个非常非常糟糕的主意.不要使用平台默认编码.没有什么可说的,如果你打电话setFoo然后getFoo你会收回相同的数据.

如果你必须做这样的事情,那么使用UTF-8,它可以代表整个Unicode ...但我真的不会这样做.它可能会节省一些内存,但代价是在大多数情况下不必要地执行转换 - 并且在未能使用适当的编码方面容易出错.

我敢说有一些应用程序适合这种情况,但对于99.99%的应用程序来说,这是一个糟糕的主意.


Kar*_*nek 10

这不是很有用:
1.每次调用getFoo或setFoo时都会复制字符串,因此会增加CPU和内存使用量
2.这是模糊的


x4u*_*x4u 5

一段历史性的短途旅行......

如果你可以确定你永远不需要ISO-8859-1之外的任何东西,那么在Java(1.0/1.1)的早期使用字节数组而不是String对象实际上具有一些相当大的优势.使用当时的VM,与drawString()相比,使用drawBytes()的速度快10倍以上,实际上它确实节省了当时仍然非常稀缺的内存,并且applet曾经拥有32的硬编码内存屏障以后64 MB.字节[]不仅比String对象的嵌入字符[]小,而且还可以保存相对较重的String对象本身,如果你有很多短字符串,这确实会产生很大的不同.除了访问普通字节数组也比使用String的访问器方法及其所有额外边界检查更快.

但是由于drawBytes在Java 1.2中不再快速,并且由于当前的JIT比当时的Symantec JIT好得多,所以byte []数组在字符串上的剩余最小性能优势不再值得麻烦.记忆优势仍然存在,因此在一些非常罕见的极端场景中仍然可能是一种选择,但现在如果不是真的有必要,那就不应该考虑.