smileVann smileVann - 11 months ago 66
Java Question

String s = new String("xyz").How many objects has been made after this line of code execute?

The commonly agreed answer to this interview question is that 2 objects are created by the code. But I don't think so; I wrote some code to confirm.

public class StringTest {
public static void main(String[] args) {
String s1 = "a";
String s2 = "a";
String s3 = new String("a");
System.out.println("s1: "+s1.hashCode());
System.out.println("s2: "+s2.hashCode());
System.out.println("s3: "+s3.hashCode());

The output is:

Application output

Does this mean that only one object was created?

my question is how many object was created by the following code:

String s = new String("xyz")

Instead of the

Inspired by @Don Branson ,I debuged the below code:

public class test {
public static void main(String[] args) {
String s = new String("abc");


and the result is:
enter image description here

the id of s is 84,and the id of "abc" is 82.what exactly does this mean?

Answer Source

First, this question really asks about this addressed here: Is String Literal Pool a collection of references to the String Object, Or a collection of Objects

So, that is a guide for everyone on this matter.


Given this line of code: String s = new String(“xyz”)

There are two ways of looking at this:

(1) What happens when the line of code executes -- the literal moment it runs in the program?

(2) What is the net effect of how many Objects are created by the statement?


1) After this executes, one additional object is created.

a) The "xyz" String is created and interned when the JVM loads the class that this line of code is contained in.

  • If an "xyz" is already in the intern pool from some other code, then the literal might produce no new String object.

b) When new String s is created, the internal char[] is a copy of the interned"xyz" string.

c) That means, when the line executes, there is only one additional object created.

The fact is the "xyz" object will have been created as soon as the class loaded and before this code section was ever run. scenario ...

2) There are three objects created by the code (including the interned "a")

String s1 = "a";
String s2 = "a";
String s3 = new String("a");

a) s1 and s2 are just referenced,not objects, and they point to the same String in memory.

b) The "a" is interned and is a compound object: one char[] object and the String object itself. It consisting of two objects in memory.

c) s3, new String("a") produces one more object. The new String("a") does not copy the char[] of "a", it only references it internally. Here is the method signature:

public String2(String original) {
        this.value = original.value;
        this.hash = original.hash;

One interned String ("a") equals 2 Objects. And one new String("a") equals one more object. Net effect from code is three objects.