In Java, strings are stored in the memory as objects of the class String.
When memory is allocated for any Java program, JVM (Java virtual machine) divides allocated memory into two parts. One part is Stack and the other part is Heap. In Heap memory, java allocates some memory, especially for literals that memory is called the String constant pool(SCP). SCP is the predefined area inside the Heap. String pool helps in saving a lot of space for Java Runtime. String class uses SCP to store unique string literals.
In Stack memory, variables or variable references or references to the objects are stored.
In Heap memory, all the objects that are dynamically allocated are stored. To allocate memory to an object we use a new keyword.
There are two ways of creating string objects.
- String literal
String str1 = “MyString”;
Whenever we create a string literal, JVM first checks if the string literal already exists in the string constant pool. If not available, it will create a new string literal in SCP.
In the picture above, str1 points to “MyString” in SCP. Following are the ways newly created string literals are handled.
- By using a new keyword
String str2 = new String(“MyString”); //Instantiating the string class using a new keyword
When a string object is created using a new keyword, it will create two objects. One in SCP another in Heap and the reference variable is stored in the stack.
We have already created the literal “MyString” by using
String str1 = “MyString”;
As we cannot have duplicates in SCP, So JVM will not create one more object in SCP but will return the existing reference to the variable str3 in the stack and it will create one object in Heap. Str3 will point to the object “MyString” in the Heap but not in SCP.
Following are the different cases of how memory is allocated for string objects.
Case 1: How the string objects defined above are stored in memory.
public class stringsStorageConcept
{
public static void main(String[] args)
{
String str1 = “MyString”;
String str2 = new String(“MyString”);
System.out.println(str1 == str2); //Output:False
System.out.println(str1.equals(str2)); //Output:True
}
}
When we compare str1 and str2 using the “==” operator it returns false. As we know “==” operator compares their physical addresses. Here in our example str1 is pointing to the object in SCP and str2 is pointing to the object in the Heap. So it returns false.
But in the case of str1.equals(str2), as we know “equals” function checks the individual characters both str1 and str3 have the same value stored it returns true.
Case 2: Another string literal
String str3 = “MyString”;
Both str1 and str3 will point to the same string literal in SCP.
public class stringsStorageConcept
{
public static void main(String[] args)
{
String str1 = “MyString”;
String str3 = “MyString”;
System.out.println(str1 == str2); //Output:True
System.out.println(str1.equals(str2)); //Output:True
}
}
s1 == s3 returns true, as “==” operator compares their physical addresses but not the content.
s1.equals(s3) returns true, and the “equals“ function checks the individual characters in both reference variables.
Case 3: Another string object is created using a new keyword
String str4 = new String(“NewString”);
In this case, JVM will check for this string in SCP it cannot find the string object with the value “NewString”, so it will create two objects one in SCP and another in Heap, the reference variable str4 will be stored in the stack. Str4 will have the reference to the object in the Heap.
Case 4: Another string literal is created.
String str5 = “NewString”;
In this case, JVM will check in SCP if this literal is already available or not, here “NewString” is already present in SCP so JVM will not create a duplicate in SCP instead it returns the reference to the variable str5.
Case 5: Assigning one string to another string
String str4 = new String(“NewString”);
String str6 = str4; //Assigning
Here str6 and str4 will point to the same object in Heap and will not erase the value in str4.
public class stringsStorageConcept
{
public static void main(String[] args)
{
String str4 = new String(“NewString”);
String str6 = str4;
System.out.println(str4 == str6); //Output:true
}
}
JVM will give the reference of the “NewString” in the heap to the variable str6. That’s the reason str4 == str6 returns true.
In conclusion, creating string objects using string literal and by ‘new’ operator has its pros and cons.
By using string literals, we can make memory more efficient by not creating duplicates. JVM creates one unique object and the string stays in the SCP forever. The downside of this is that the string pool has a fixed size and it will get full at some time.
But by using a new keyword it creates two objects, one in SCP and the other in Heap. In a Heap, if we don’t need the object it will be erased by a garbage collector to make space. But the downside of this is that with a ‘new’ operator JVM will always have to create a new object and it is an overload for JVM.
The above is the detailed content of Memory Allocation of Strings in Java. For more information, please follow other related articles on the PHP Chinese website!

The article discusses implementing multi-level caching in Java using Caffeine and Guava Cache to enhance application performance. It covers setup, integration, and performance benefits, along with configuration and eviction policy management best pra

Java's classloading involves loading, linking, and initializing classes using a hierarchical system with Bootstrap, Extension, and Application classloaders. The parent delegation model ensures core classes are loaded first, affecting custom class loa

This article explores integrating functional programming into Java using lambda expressions, Streams API, method references, and Optional. It highlights benefits like improved code readability and maintainability through conciseness and immutability

The article discusses using JPA for object-relational mapping with advanced features like caching and lazy loading. It covers setup, entity mapping, and best practices for optimizing performance while highlighting potential pitfalls.[159 characters]

The article discusses using Maven and Gradle for Java project management, build automation, and dependency resolution, comparing their approaches and optimization strategies.

This article explains Java's NIO API for non-blocking I/O, using Selectors and Channels to handle multiple connections efficiently with a single thread. It details the process, benefits (scalability, performance), and potential pitfalls (complexity,

The article discusses creating and using custom Java libraries (JAR files) with proper versioning and dependency management, using tools like Maven and Gradle.

This article details Java's socket API for network communication, covering client-server setup, data handling, and crucial considerations like resource management, error handling, and security. It also explores performance optimization techniques, i


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),