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%的应用程序来说,这是一个糟糕的主意.
一段历史性的短途旅行......
如果你可以确定你永远不需要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 []数组在字符串上的剩余最小性能优势不再值得麻烦.记忆优势仍然存在,因此在一些非常罕见的极端场景中仍然可能是一种选择,但现在如果不是真的有必要,那就不应该考虑.
| 归档时间: |
|
| 查看次数: |
2700 次 |
| 最近记录: |