所以我正在阅读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";
}
答案 0 :(得分:3)
在Java中,同一字符串文字的任何实例始终评估为同一对象。换句话说,在上述两种情况下,只会创建一个String
对象,并且通过让每个条目引用一个字符串来填充数组。两者之间不应该有明显的性能差异。
希望这有帮助!
答案 1 :(得分:0)
“Whenever”是编译器看到的,而不是程序看到的。编译器编译程序的第3行时,编译器只看到一次字符串"am a new string EVERY time"
。所以只有一个副本。
通常,您知道您正在创建一个新对象,因为您使用new
关键字(或者您调用的函数)。
答案 2 :(得分:0)
所有编译时字符串文字都是实习的(Java)。 在第一种情况下,内存中只有一个字符串和许多指针。 第二种情况完全相同。
答案 3 :(得分:0)
使用它就像你在编译时一样,字符串表在编译时创建一次而不是为每个字符串重复,如果你创建的大型数组都指向同一个对象,你仍然在为数组本身使用内存。如果您使用StringBuffer类型对象或new()或从控制台获取输入,那么您将使用堆和内存