在Java中,未分配给变量的字符串文字是否会导致内存泄漏?

在Java中,未分配给变量的字符串文字是否会导致内存泄漏?,java,string,Java,String,假设我有一个接受字符串参数的函数,比如 func(“abc”) “abc”是否会被实习(存储在字符串池中)?如果func(“abc”)将被调用十亿次,java会在池中创建十亿个“abc”字符串对象副本吗?否。在字符串池中只会创建一个副本,所有具有相同字符串值的变量都将指向该副本 为了更加清晰,您可以查看下图: 是,“abc”将存储在字符串池中。除非使用new运算符显式创建新字符串,否则不会创建新字符串 不建议强制创建新对象。但即使这样做,也不会导致内存泄漏,因为新对象已绑定到特定范围,并且在不再

假设我有一个接受字符串参数的函数,比如
func(“abc”)


“abc”
是否会被实习(存储在字符串池中)?如果
func(“abc”)
将被调用十亿次,java会在池中创建十亿个“abc”字符串对象副本吗?

否。在字符串池中只会创建一个副本,所有具有相同字符串值的变量都将指向该副本

为了更加清晰,您可以查看下图:

是,“abc”将存储在字符串池中。除非使用
new
运算符显式创建新字符串,否则不会创建新字符串

不建议强制创建新对象。但即使这样做,也不会导致内存泄漏,因为新对象已绑定到特定范围,并且在不再引用时将被垃圾收集。请阅读以下摘录:

字符串文字是对类字符串实例的引用 (§4.3.1,§4.3.3)

此外,字符串文字总是指类的同一实例 字符串。这是因为字符串文字,或者更一般地说,字符串 这些是常量表达式(§15.28)的值,是“内部的” 以便使用String.intern方法共享唯一实例 (§12.5)

Java中的字符串“interning”是将字符串对象存储在池中,以便代码中字符串文本的多个副本引用同一个字符串对象,而不是多个“相同”的字符串对象。或许,下面的示例将进一步说明这一点:

String hello = "Hello"; //A new String object with the value "Hello" is created in the String pool; the variable hello references that object in the pool
System.out.println(hello == "Hello"); //prints true
因此,在您的情况下,即使您使用相同的字符串文字持续调用方法
func
10亿次,池中也只存在一个值为“abc”的字符串对象,并且所有文字“abc”都引用相同的对象

for (long i = Integer.MAX_VALUE; i <= Integer.MAX_VALUE; i++)
    func("abc"); //Only 1 String object is created

for(long i=Integer.MAX\u VALUE;i)它将被存储在字符串池中。它不会被创建十亿次。这就是拥有一个池的意义。否。代码中所有相同的字符串文本共享一个内存位置。您可以将
“abc”
在您的代码中重复了一百万次,它仍然是相同的字符串,占用的内存量与您曾经放过的相同。值得注意的是,Java有垃圾收集功能,因此即使它确实创建了十亿个
“abc”
(它没有)不会有内存泄漏。在Java中很难创建内存泄漏。这可能是不可能的(或者至少没有常见的方法)现在,我相信所有已知的方法都已经固定在这一点上。进一步的阅读。Java中的内存泄漏是因为在你真正需要它们之后,继续保存对象。这是C和C++的反面,它们是由于丢失指针而不释放或删除它们而造成的。如果java文字不被分配,那会怎样?被分配到变量,如我的示例中的函数参数?我认为在分配给变量时会发生实习。@return0否。任何有字符串文字的地方都会发生实习。实习发生在类文件从内存读入系统时。实习不会发生在代码执行期间。'string“interning”在Java中,不仅仅是在字符串池中存储字符串文字:是的,它是,本段的其余部分只是解释了“字符串池”的含义。唯一性的概念已经嵌入到“字符串池”中。您应该删除此段。@user207421,感谢您的反馈。我用更好的文字编辑了它。
for (long i = Integer.MAX_VALUE; i <= Integer.MAX_VALUE; i++)
     func(new String("abc")); //multiple String objects with the same value are created and will continue to exist until garbage collected.