在存储我们经常使用的String
值时,我们是否会减少内存消耗?
据我所知,每次在代码中执行"some text"
声明时,都会构造一个新的String
对象,而不是使用具有相同值的现有对象的地址。这是对的吗?
通过始终寻址相同的String
而不是创建新的{{1}},是否可以采取任何措施来提高记忆效率?
答案 0 :(得分:2)
.NET使用string intern pool来存储字符串。
公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串实例仅在系统中存在一次。
下面的示例显示实习池仅用于文字字符串。 (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:
所有文字字符串和字符串值常量表达式都是实现的。
答案 1 :(得分:1)
除非你能找出你想要解决的真正的性能/内存问题,否则我不会感到厌烦。如果你绝对必须优化,那么Javamex有一个useful article显示一些关于如何节省内存的技巧,例如使用Java的内部字符串池。
答案 2 :(得分:1)
来自java 2 sdk的api-doc:
字符串池(最初为空)由String类私有维护。 调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
所以有汇集......
文章here对此提出了一些好处。
答案 3 :(得分:0)
在Java中,你完全错了。事实上,就像.net(或至少像@madgnome所说)一样,有一个constant string pool。请注意,除了所有常量字符串之外,您还可以通过调用String.intern()
将字符串推送到此池。但要小心使用这种方法,因为它可能会因为该池的性质而变慢。