当我们存储非常频繁使用的String
值时,我们是否会减少内存消耗?Java/.NET - 重复使用值
据我所知,每次我们在代码中做一个"some text"
声明时,都会构造一个新的String
对象,而不是使用具有相同值的现有对象的地址。它是否正确?
是否有任何事情可以通过始终处理相同的String
而不是创建新内存来提高内存的效率?
当我们存储非常频繁使用的String
值时,我们是否会减少内存消耗?Java/.NET - 重复使用值
据我所知,每次我们在代码中做一个"some text"
声明时,都会构造一个新的String
对象,而不是使用具有相同值的现有对象的地址。它是否正确?
是否有任何事情可以通过始终处理相同的String
而不是创建新内存来提高内存的效率?
.NET使用string intern pool来存储字符串。
公共语言运行库通过维护一个名为intern池的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字串的实例仅在系统中存在一次。
以下示例显示实习生池仅用于文字字符串。 (s2
不引用相同的字符串作为s1
即使内容是一样的)
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
Java那样the same thing:
所有文字字符串和字符串值常量表达式拘留。
除非您能确定您正在尝试解决的真正性能/内存问题,否则我不会冒汗。如果您绝对必须进行优化,那么Javamex有一个useful article显示如何节省内存的一些提示,例如通过使用Java的内部字符串池。
在Java中,你完全错了。事实上,就像.net(或者至少像@madgnome所说的那样),有一个constant string pool。请注意,除了所有常量字符串外,还可以通过调用String.intern()
将字符串推送到此池中。但谨慎使用此方法,因为该池的性质可能会变慢。
从API-doc的用于Java 2 SDK:
字符串,初始为空的池,由类字符串私人维护。 当调用intern方法时,如果池已经包含与equals(Object)方法确定的String对象相等的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
所以汇集...
文章here,使一些好点了。
Java对字符串也做同样的事情。 http://download-llnw.oracle.com/javase/6/docs/api/java/lang/String.html有一行“所有文字字符串和字符串值常量表达式都被实现了,字符串文字在§3.10中定义。Java语言规范的第5部分“ – birryree 2010-10-13 14:47:09
Java也实现了字符串文字:”字符串文字 - 或者更一般地说是常量表达式的值(§15.28)的字符串 - 被“实施”以共享唯一的实例,使用方法String.intern。“ - Java语言规范第3版,§3.10.5http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5 – Powerlord 2010-10-13 14:47:10
谢谢@kuropenguin和@ R. Bemrose。我已经更新了我的答案! – 2010-10-13 14:50:15