【发布时间】:2014-11-25 18:15:29
【问题描述】:
所以,如果我声明一个String对象str并给它赋值,然后给同一个String对象str赋值不同的值,由于String类是不可变的,一个新的String对象会在内存中创建,str现在指向到这个新对象。但是,既然旧的 String 对象现在没有被引用,为什么不能立即进行垃圾回收呢?我知道,如果使用相同的值创建一个新的 String 文字,则会返回相同的早期对象,但无论如何它不太可能发生。当 JVM 知道糟糕的开发人员在他巨大的 for 循环的每次迭代中创建 3 个 String 对象时,它是否有理由不运行 GC?
【问题讨论】:
-
我知道如果创建了一个新的字符串字面量你如何创建和分配你的
String对象? -
我的意思是我做 String strAllOverAgain = "asd"; //假设 asd 是之前字符串的值
-
String foo = "asd"; foo = "asd";不会重新创建 asd 字符串实例。它正在重复使用相同的内容。并且引用“asd”不会创建它,它可以是存在于某处的常量,可能是因为使用它的类已加载 -
我知道。我的意思是这个。
String foo ="asd"; System.out.println("foo is " + foo.hashCode()); foo = "def"; System.out.println("foo is " + foo.hashCode()); String boo = "asd"; System.out.println("boo is " + boo.hashCode()); -
关于文字的创建方式/时间/地点:blog.jamesdbloom.com/JVMInternals.html#constant_pool
标签: java string garbage-collection jvm