之间的区别(内存方面)
private static final String FAILURE_MESSAGE= "...";
protected String getFailedMsg() {
return FAILURE_MESSAGE;
}
和
protected String getFailedMsg() {
return "...";
}
假设FAILURE_MESSAGE
仅从上述函数中引用。
我指的是在上述情况下上述对象/字符串在内存中的位置和方式如何? 它是JVM特有的吗?
编辑:我知道字符串是在第一种方法中实现的,但是在调用函数之前,第二种方法中的值是在哪里存储/保持/(实习?)?
第二次编辑作为事后的想法 - 如果用int或其他不是字符串的类替换字符串怎么办?
答案 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 =“...”之后,如果你尝试在任何方法中返回“...”,则两者都指向在字符串池中创建的一个字符串文字。