首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一个有效的内存替代java.lang.String?

是否有一个有效的内存替代java.lang.String?
EN

Stack Overflow用户
提问于 2008-10-23 19:13:37
回答 14查看 22.3K关注 0票数 37

在阅读了测量几种对象类型的内存消耗的这篇旧文章之后,我惊讶地看到String在Java中使用了多少内存:

代码语言:javascript
运行
复制
length: 0, {class java.lang.String} size = 40 bytes
length: 7, {class java.lang.String} size = 56 bytes

虽然这篇文章有一些技巧来减少这一点,但我并不认为它们完全令人满意。使用char[]存储数据似乎是浪费的。对于大多数西方语言来说,最明显的改进是使用byte[]和像UTF-8这样的编码,因为您只需要一个字节来存储最频繁的字符,而不是两个字节。

当然,我们可以使用String.getBytes("UTF-8")new String(bytes, "UTF-8")。甚至字符串实例本身的开销也会消失。但是在那里你失去了非常方便的方法,比如equals()hashCode()length(),…

据我所知,Sun有一个关于字符串的专利 on byte[]表示。

用于在编程环境中高效表示字符串对象的框架 ..。这些技术可以在适当的时候作为一个字节字符数组来创建Java字符串对象.

但我没能找到那个专利的API。

为什么我在乎?

在大多数情况下,我不这样做,但我处理的应用程序具有巨大的缓存,包含了大量的String,这将从更有效地使用内存中受益。

有人知道这样的API吗?或者,是否有其他方法来保持String的内存占用空间小,即使代价是CPU性能或更丑的API?

请不要重复上述文章中的建议:

  • 自己的String.intern()变体(可能与SoftReferences一起)
  • 存储单个char[]并利用当前的String.subString(.)实现来避免数据复制(讨厌)

更新

我在Sun当前的JVM (1.6.0_10)上运行了本文中的代码。它取得了与2002年相同的结果。

EN

Stack Overflow用户

发布于 2008-10-23 19:17:13

出于好奇,节省的几个字节真的值得吗?

通常,出于性能原因,我建议放弃字符串,以支持StringBuffer (记住,字符串是不可变的)。

您真的从字符串引用中耗尽了堆吗?

票数 0
EN
查看全部 14 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/231051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档