Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java- Creating String object using new keyword

Tags:

java

string

I know the difference between String literal and new String object and also know how it works internally.But my question is little bit advance of this.When we create String object using new keyword as

String str = new String("test");

In this case, we are passing a argument of String type. My questions is where this string gets generated - Heap Or String constant pool Or somewhere else?

As up to my knowledge, this argument is a string literal so it should be in String constant pool.If is it so then what is use of intern method - only just link variable str to constant pool? because "test" would be available already.

Please clarify me, if I had misunderstood the concept.

like image 444
Ankit Sharma Avatar asked Feb 10 '15 08:02

Ankit Sharma


People also ask

How many String objects are created using new keyword in Java?

The answer is: 2 String objects are created. str and str2 both refer to the same object. str3 has the same content but using new forced the creation of a new, distinct, object.

Can we create String object using new operator?

When we create a String object using the new() operator, it always creates a new object in heap memory. On the other hand, if we create an object using String literal syntax e.g. “Baeldung”, it may return an existing object from the String pool, if it already exists.

Where are String objects stored when using new keyword?

String objects created with new operator are stored in the heap memory area and there is no sharing of storage for the same contents of different string objects.


1 Answers

The statement String str = new String("test"); creates a string object which gets stored on the heap like any other object. The string literal "test" that is passed as an argument is stored in the string constant pool.

String#intern() checks if a string constant is already available in the string pool. If there is one already it returns it, else it creates a new one and stores it in the pool. See the Javadocs:

Returns a canonical representation for the string object.

A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

Starting from JDK7, interned strings are stored on the heap. This is from the release notes of JDK7:

In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.

like image 135
M A Avatar answered Sep 28 '22 09:09

M A