存储在内存中的JVM字符串

时间:2012-03-15 08:57:30

标签: java memory jvm

之间的区别(内存方面)
private static final String FAILURE_MESSAGE=    "...";

protected String getFailedMsg() {
    return FAILURE_MESSAGE;
}

protected String getFailedMsg() {
    return "...";
}

假设FAILURE_MESSAGE仅从上述函数中引用。

我指的是在上述情况下上述对象/字符串在内存中的位置和方式如何? 它是JVM特有的吗?

编辑:我知道字符串是在第一种方法中实现的,但是在调用函数之前,第二种方法中的值是在哪里存储/保持/(实习?)?

第二次编辑作为事后的想法 - 如果用int或其他不是字符串的类替换字符串怎么办?

5 个答案:

答案 0 :(得分:4)

第一个例子没有编译,第二个例子没有编译。

性能通常不如简单性和清晰度重要,你在这方面有一个很好的例子。如果它编译了,第一个例子就会像第二个例子一样快。

BTW:使用字符串文字的次数和次数并不重要,它们都是String.intern()所以它们都是同一个对象。

答案 1 :(得分:1)

字符串文字引用相同的String对象,因此在这种情况下,内存没有区别。

Java语言规范3.0 3.10.5字符串文字部分说明:

  

字符串文字总是引用类String的相同实例(第4.3.1节)...... [它们]   “interned”以便使用String.intern方法共享唯一的实例。

答案 2 :(得分:1)

所有字符串文字都将被实现,因此它没有任何区别(在内存方面,查看String实例)。

唯一的区别是,在第一种情况下,该类包含一个指向String实例的引用指针。第二种方法仅在堆栈上创建引用。

答案 3 :(得分:1)

在两种情况下生成的字节码都相同:

protected java.lang.String getFailedMsg()
    0 ldc 2 (java.lang.String) "..."
    2 areturn

所以它纯粹是糖。

答案 4 :(得分:0)

在这两种情况下,它都会在字符串池中创建文字。在创建String s =“...”之后,如果你尝试在任何方法中返回“...”,则两者都指向在字符串池中创建的一个字符串文字。