Consider the following code, string s=new string(); will create an instance of string with

In the given example only one object will be created. Firstly JVM will not find any string object with the value “Welcome” in string constant pool, so it will create a new object. After that it will find the string with the value “Welcome” in the pool, it will not create new object but will return the reference to the same instance.

Note: String objects are stored in a special memory area known as string constant pool.

Why java uses the concept of string literal?

To make Java more memory efficient (because no new objects are created if it exists already in string constant pool). 

2. By new keyword

  • String s=new String(“Welcome”);
  • In such a case, JVM will create a new string object in normal (non pool) heap memory and the literal “Welcome” will be placed in the string constant pool. The variable s will refer to the object in heap (non pool).

Example:

Java

public class StringExample

    public static void main(String args[])

    

        String s1=new String("example");

        System.out.println(s1);

    }

}

Syntax:  

<String_Type> <string_variable> = "<sequence_of_string>"; 

Example:  

String str = "Geeks";

Consider the following code, string s=new string(); will create an instance of string with

Memory allotment of String: Whenever a String Object is created as a literal, the object will be created in the String constant pool. This allows JVM to optimize the initialization of String literal.

For example: 

String str = "Geeks";

The string can also be declared using new operator i.e. dynamically allocated. In case of String are dynamically allocated they are assigned a new memory location in heap. This string will not be added to String constant pool.

For example: 

String str = new String("Geeks");

If you want to store this string in the constant pool then you will need to “intern” it.

For example:

String internedString = str.intern(); 
// this will add the string to string constant pool.

It is preferred to use String literals as it allows JVM to optimize memory allocation.

An example that shows how to declare a String 

Java

import java.io.*;

import java.lang.*;

class Test {

    public static void main(String[] args)

    {

        String s = "GeeksforGeeks";

        System.out.println("String s = " + s);

        String s1 = new String("GeeksforGeeks");

        System.out.println("String s1 = " + s1);

    }

}

Output

String s = GeeksforGeeks
String s1 = GeeksforGeeks

Interfaces and Classes in Strings in Java

CharBuffer: This class implements the CharSequence interface. This class is used to allow character buffers to be used in place of CharSequences. An example of such usage is the regular-expression package java.util.regex.

String: It is a sequence of characters. In java, objects of String are immutable which means a constant and cannot be changed once created.

Ways of Creating a String

There are two ways to create a string in Java: 

String literal

String s = “GeeksforGeeks”;

Using new keyword

String s = new String (“GeeksforGeeks”);

StringBuffer is a peer class of String that provides much of the functionality of strings. The string represents fixed-length, immutable character sequences while StringBuffer represents growable and writable character sequences.

Syntax:

StringBuffer s = new StringBuffer("GeeksforGeeks");

StringBuilder in Java represents a mutable sequence of characters. Since the String Class in Java creates an immutable sequence of characters, the StringBuilder class provides an alternate to String Class, as it creates a mutable sequence of characters.

Syntax:

StringBuilder str = new StringBuilder();
str.append("GFG");

StringTokenizer class in Java is used to break a string into tokens. 

Example:

Consider the following code, string s=new string(); will create an instance of string with

A StringTokenizer object internally maintains a current position within the string to be tokenized. Some operations advance this current position past the characters processed. A token is returned by taking a substring of the string that was used to create the StringTokenizer object.

StringJoiner is a class in java.util package which is used to construct a sequence of characters(strings) separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix. Though this can also be with the help of StringBuilder class to append delimiter after each string, StringJoiner provides an easy way to do that without much code to write.

Syntax:

public StringJoiner(CharSequence delimiter)

Above we saw we can create string by  String Literal. 

For ex- // String s=”Welcome”; 

Here the JVM checks the String Constant Pool. If the string does not exist, then a new string instance is created and placed in a pool. If the string exists, then it will not create a new object. Rather, it will return the reference to the same instance. The cache that stores these string instances is known as the String Constant pool or String Pool. In earlier versions of Java up to JDK 6 String pool was located inside PermGen(Permanent Generation) space. But in JDK 7 it is moved to the main heap area. 

Why did the String pool move from PermGen to the normal heap area? 

PermGen space is limited, the default size is just 64 MB. it was a problem with creating and storing too many string objects in PermGen space. That’s why the String pool was moved to a larger heap area. To make Java more memory efficient, the concept of string literal is used. By the use of the ‘new’ keyword, The JVM will create a new string object in the normal heap area even if the same string object is present in the string pool. 

For example:

String a=new String(“Bhubaneswar”)

Let us have a look at the concept with a java program and visualize the actual JVM memory structure: 

Program:

Java

class StringStorage {

    public static void main(String args[])

    {

        String s1 = "TAT";

        String s2 = "TAT";

        String s3 = new String("TAT");

        String s4 = new String("TAT");

        System.out.println(s1);

        System.out.println(s2);

        System.out.println(s3);

        System.out.println(s4);

    }

}

Consider the following code, string s=new string(); will create an instance of string with

Note: All objects in Java are stored in a heap. The reference variable is to the object stored in the stack area or they can be contained in other objects which puts them in the heap area also.

Example 1: 

Java

class GFG{

public static void main(String args[]){

byte ascii[]={71,70,71};

  String s1= new String(ascii);

  System.out.println(s1);

   String s2= new String(ascii,1,2);

  System.out.println(s2);

}

}

Example 2:

Java

class GFG{

public static void main(String args[])

{

  char c[]={'G','f','g'};

  String s1=new String (c);

  String s2=new String (s1);

  System.out.println(s1);

  System.out.println(s2);

}

}

Immutable String in Java

  • In java, string objects are immutable. Immutable simply means unmodifiable or unchangeable.
  • Once string object is created its data or state can’t be changed but a new string object is created.

Java

class Demo

    public static void main(String args[])

    

        String s="Sachin"

        s.concat(" Tendulkar");   

        System.out.println(s);   

    

}

Now it can be understood by the diagram given below. Here Sachin is not changed but a new object is created with “Sachin Tendulkar”. That is why string is known as immutable.

As you can see in the given figure that two objects are created but s reference variable still refers to “Sachin” not to “Sachin Tendulkar”.
But if we explicitly assign it to the reference variable, it will refer to “Sachin Tendulkar” object.            For example:

Java

class Demo

    public static void main(String args[])

    

        String s="Sachin"

        s=s.concat(" Tendulkar"); 

        System.out.println(s); 

    

}

Why string objects are immutable in java?

Because java uses the concept of string literal. Suppose there are 5 reference variables, all referes to one object “sachin”. If one reference variable changes the value of the object, it will be affected to all the reference variables. That is why string objects are immutable in java.


What is new String () in Java?

By new keyword : Java String is created by using a keyword “new”. For example: String s=new String(“Welcome”); It creates two objects (in String pool and in heap) and one reference variable where the variable 's' will refer to the object in the heap.

Which of the following method will create string in Java Mcq?

The intern() and toString() methods are of String class. Hence, the correct answer is option (c).

What is the use of charAt () method Mcq?

Explanation: charAt() is a method of class String which gives the character specified by the index.

How do you assign a string to another string in Java?

Approach:.
Get the Strings and the index..
Create a new String..
Traverse the string till the specified index and copy this into the new String..
Copy the String to be inserted into this new String..
Copy the remaining characters of the first string into the new String..
Return/Print the new String..