对字符串不变性的困惑

时间:2014-02-25 06:07:29

标签: java string immutability

我有以下代码: -

public class StaticImplementer {
    private static String str= "ABC";
    public static void main(String args[]) {
        str = str + "XYZ";
    }
}

问题: -

  1. 这里String str是静态的,那么这个对象将存储在内存中?

  2. 由于String是不可变的,“XYZ”的对象将被存储在哪里?

  3. 最终对象将在哪里存储?

  4. 垃圾收集将如何进行?

2 个答案:

答案 0 :(得分:3)

  

1)这里String str是静态的,然后存储该对象的位置   存储器?

无论variable是否被声明为static,这些文字都将存储在字符串池内存中。 更多信息:Where does Java's String constant pool live, the heap or the stack?

  

2)因为String是不可变的,所以“XYZ”的对象将被存储?

与第一个答案类似:文字将存储在池内存中。 Immutability只允许共享池内存的概念。

  

3)最终对象将在哪里存储?

根据Java specification,文字的连接也将结束于文字(因为在编译时已知),存储在池内存中。
摘录:

"This is a " +        // actually a string-valued constant expression,
    "two-line string"    // formed from two string literals
  

4)垃圾收集将如何进行?

作为池内存的本质,默认情况下它们不会被垃圾回收。 实际上,如果立即收集垃圾,池的“共享”概念将会失败。

答案 1 :(得分:2)

  

这里String str是静态的,然后存储该对象的位置   存储器?

String str不是对象,它是对象的引用。 "ABC""XYZ"& "ABCXYZ"是三个不同的String对象。因此,str指向一个字符串。你可以改变它所指向的内容,但不能改变它指向的内容。

  

由于String是不可变的,“XYZ”的对象将被存储在哪里?

如上所述&同样由Mik378,"XYZ"只是一个String对象,它被保存在String池内存中,当"XYZ"被声明或分配给任何其他对象时,将返回对此内存的引用。

  

最终对象将在哪里存储?

最终对象"ABCXYZ"也将保存到池内存中,当操作分配给任何变量时,引用将返回给对象。

  

垃圾收集将如何完成?

字符串文字是实习的。从Java 7开始,H​​otSpot JVM将实际的字符串放入堆中,而不是permgen。在早期版本的Java中,JVM在permgen中放置了实际的字符串。然而,permgen中的字符串被垃圾收集。显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,但默认情况下可能不会在某些旧JVM中启用permgen集合。

正在实习的字符串文字将是由声明的Class对象保留在实习池中的String对象所持有的引用。因此,只有在收集引用它的Class对象时,才会收集实习的文字字符串。

Shishir