String
存储我们经常使用的值时,我们是否会减少内存消耗?
据我所知,每次我们"some text"
在代码中进行声明时,都会构造一个新String
对象,而不是使用具有相同值的现有对象的地址。它是否正确?
有什么办法可以通过始终寻址相同String
而不是创建新的来提高内存效率?
String
存储我们经常使用的值时,我们是否会减少内存消耗?
据我所知,每次我们"some text"
在代码中进行声明时,都会构造一个新String
对象,而不是使用具有相同值的现有对象的地址。它是否正确?
有什么办法可以通过始终寻址相同String
而不是创建新的来提高内存效率?
.NET 使用字符串实习池来存储字符串。
公共语言运行时通过维护一个称为实习池的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串的实例在系统中仅存在一次。
下面的示例显示实习池仅用于文字字符串。(即使内容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 做同样的事情:
所有文字字符串和字符串值的常量表达式都是实习的。
除非您能确定您正在尝试解决的真正的性能/内存问题,否则我不会出汗。如果您绝对必须优化,那么 Javamex 有一篇有用的文章展示了一些关于如何节省内存的技巧,例如使用 Java 的内部字符串池。
来自 java 2 sdk 的 api-doc:
一个字符串池,最初是空的,由 String 类私下维护。当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,该字符串由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。
所以有池...
这篇文章在这里提出了一些很好的观点。
在 Java 中,你完全错了。实际上,就像在 .net 中一样(或者至少像 @madgnome 所说的那样),有一个常量字符串 pool。请注意,除了所有常量字符串之外,您还可以通过调用将字符串推送到此池中String.intern()
。但请谨慎使用此方法,因为由于该池的性质,它可能会很慢。