JAVA字符串对象数

May*_*dya 3 java

任何人都可以从这个链接http://www.javatpoint.com/corejava-interview-questions-3解释问题87和89

87)以下代码中将创建多少个对象?

String s1 = "string1";
String s2 = "string1";
String s3 = "string1";
Run Code Online (Sandbox Code Playgroud)

答案是:只有一个对象

89)以下代码中将创建多少个对象?

String s = new String("Welcome");  
Run Code Online (Sandbox Code Playgroud)

答案是:两个对象,一个在字符串常量池中,另一个在非池(堆)中.

Ale*_*exR 6

虽然String是一个用Java编写的类,但它是一种与JVM有一些特殊关系的特殊类.其中一个是字符串文字(用引号括起来的字符序列).当JVM看到"abc"它执行如下操作时:

String obj = stringLiteralsCache.get("abc");
if (obj == null) {
    obj = new String("abc");
    stringLiteralsCache.put("abc", obj);
}
Run Code Online (Sandbox Code Playgroud)

因此,在第一个示例中,第一行导致创建新实例,但接下来的两行只是从缓存中获取已创建的实例.

但缓存仅适用于文字.当您显式调用构造函数时,它无法阻止创建新实例.因此,new String("Welcome")创建了两个对象:一个来自文字,Welcome因为它不在缓存中,第二个来自显式调用String构造函数.