【问题标题】:Are string literal created every time?每次都创建字符串文字吗?
【发布时间】:2014-05-27 01:03:08
【问题描述】:

所以我正在阅读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";
}

【问题讨论】:

  • 不,这将每次在数组中放置相同的文字。这是合乎逻辑的——毕竟它在你的源文件中只出现一次,即使它在一个循环中。还有字符串实习。
  • 我想知道,因为在 JavaScript 中,我将预先使用的所有字符串存储在一个数组中,然后再调用它们

标签: java string optimization memory-management


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

  • 所以对于第二个,我不必担心抓取收集,因为那时不会创建一堆字符串,只创建一次?
【解决方案2】:

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

一般来说,您知道您正在创建一个新对象,因为您使用了new 关键字(或者您调用了一个这样做的函数)。

【讨论】:

  • 编译器总是这样做还是我必须启用某些东西?
  • 好的,谢谢,我只是想确定一下,因为我不知道如何使用编译器进行优化,比如 -java C 或类似的东西
【解决方案3】:

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

Wikipedia - String Interning

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多