java中如何垃圾收集字符串对象?

java中如何垃圾收集字符串对象?,java,string,garbage-collection,Java,String,Garbage Collection,我们知道,当我们创建字符串对象时,比如stringvalue=newstring(“ABC”) 然后将创建新的String对象,当我们再次将value变量用作value=“xyz”时,将创建一个新的String对象 所以我的问题是,以前创建的String对象将在哪一点被垃圾收集?就像其他String对象一样,JVM也遵循同样的方法,一旦应用程序失去引用,它就有资格被垃圾收集 对于您的情况,新字符串(“ABC”)未被插入,因此它不会进入字符串池,并且当您再次为“ABC”创建字符串时,会在堆中创建一

我们知道,当我们创建字符串对象时,比如
stringvalue=newstring(“ABC”)
然后将创建新的
String
对象,当我们再次将value变量用作
value=“xyz”
时,将创建一个新的
String
对象


所以我的问题是,以前创建的
String
对象将在哪一点被垃圾收集?

就像其他String对象一样,JVM也遵循同样的方法,一旦应用程序失去引用,它就有资格被垃圾收集

对于您的情况,新字符串(“ABC”)未被插入,因此它不会进入字符串池,并且当您再次为“ABC”创建字符串时,会在堆中创建一个新对象

String value  = new String("ABC");
       value  = new String("ABC");
在上面的示例中,执行两行之后,第一个对象符合垃圾收集的条件

value=“xyz”创建的字符串也将被插入,因此它将在字符串池中创建,当您使用value=“xyz”创建字符串时,上一个对象将从字符串池返回

String value  ="xyz";
       value  ="xyz";
在上面的示例中,在执行两行之后,只创建了一个对象,我们也为其创建了引用,因此它不符合垃圾收集的条件


有关字符串何时进入字符串池的更多详细信息

String value  ="xyz";
       value  ="xyz";
是案例

  • 新建字符串()始终创建新对象。这不是实习,所以你 无法从记忆中取回它
  • 无案例

  • 字符串a=“aa”如果已经可用,则在 不可用它会创建新对象,该对象也会被拘留。
  • 新字符串().intern()或“aa.intern()”如果已经可用,则从池中检索,如果不可用,则创建新对象 也在实习
  • 连接(“a”+“b”)

  • 无论何时在JAVA中调用
    new
    ,它都会在堆中创建一个对象,但如果是字符串文本,它将进入字符串常量池

    示例代码:

    String value = new String("ABC");
    value = "xyz";
    
    现在,在上面的示例代码中,“ABC”和“xyz”字符串文本将进入字符串常量池,不会被垃圾收集,但最后
    value
    指的是字符串常量池中的“xyz”

    所以基本上有3个对象,2个在字符串常量池中,1个在堆中

    在哪一点之前创建的字符串对象将被垃圾回收

    创建的对象new
    在其作用域/生命期结束或没有访问它的引用时将被垃圾收集。它同样适用于包括字符串在内的所有对象

    由于
    引用将指向下一行字符串常量轮询中值为“xyz”的现有对象,因此以前在堆中使用
    新建
    创建的对象有资格进行垃圾收集,但不符合仍在字符串常量池中的“ABC”字符串文字


    试着想象一下


    Refere:字符串文字的串联将创建一个集合文字。看看JLS。@EJP你是对的,不记得当时我是如何测试它并得出这个结论的。但今天的测试表明你是对的。我已经更新了答案,无法使用手机正确更新。