是否每次都创建字符串文字?

时间:2014-04-12 22:28:00

标签: java string optimization memory-management

所以我正在阅读orcale java tutorials并阅读

  

在这种情况下," Hello world!"是一个字符串文字 - 代码中的一系列字符,用双引号括起来。每当它在代码中遇到字符串文字时,编译器就会创建一个String对象,其值为

我想确保不是一直在创建随机值,但这让我很困惑,这是否意味着每次我使用字符串文字时,都会创建一个字符串对象?

例如,如果我想避免创建新对象

String message = "am a NOT new string"
for(int i = 0; i < 1000; i++)
{    
     someStringarray[i] = message;
}

更有效
for(int i = 0; i < 1000; i++)
{
     someStringarray[i] = "am a new string EVERY time";
}

4 个答案:

答案 0 :(得分:3)

在Java中,同一字符串文字的任何实例始终评估为同一对象。换句话说,在上述两种情况下,只会创建一个String对象,并且通过让每个条目引用一个字符串来填充数组。两者之间不应该有明显的性能差异。

希望这有帮助!

答案 1 :(得分:0)

“Whenever”是编译器看到的,而不是程序看到的。编译器编译程序的第3行时,编译器只看到一次字符串"am a new string EVERY time"。所以只有一个副本。

通常,您知道您正在创建一个新对象,因为您使用new关键字(或者您调用的函数)。

答案 2 :(得分:0)

所有编译时字符串文字都是实习的(Java)。 在第一种情况下,内存中只有一个字符串和许多指针。 第二种情况完全相同。

Wikipedia - String Interning

答案 3 :(得分:0)

使用它就像你在编译时一样,字符串表在编译时创建一次而不是为每个字符串重复,如果你创建的大型数组都指向同一个对象,你仍然在为数组本身使用内存。如果您使用StringBuffer类型对象或new()或从控制台获取输入,那么您将使用堆和内存