In this short post, we are going to discuss the different features and characteristics of the Java String class.
Introduction
We often deal with a lot of text in many applications. It can be a simple “welcome”; message to a website. Strings are a group of characters enclosed between double quotes (” “) like “Welcome“, “success”, “Hello@!2” etc. The Java String is an immutable class in the default Java package java.lang which is available for every Java file (You don’t need an import statement for this.). Let’s take a closer look at a few important aspects of the String class.
1. Creating a String
There are 2 ways to create a String Object.
- Using the new operator.
- String literal.
1.1 The new Operator
String string=new String("welcome");
1.2 String Literal
Assigning the String literal value directly using the assignment(=)
operator
String string="welcome";
The former will always create a new String object using the new operator but when literal values are directly assigned as shown in the second way to a String it may or may not create an object due to the concept of String constant pooling in java.
2. String Constant Pool
Memory allocation happens for any object irrespective of String class when created using the new operator String string=new String("Hello");
. String Pool provides a better memory allocation when using Java String literal values. When a String object created directly by assigning literal values then the memory allocation happens only once by the JVM so, that the same reference can be referenced again when another String object with the same literal value requested instead of creating a new String object.
Above shows the Java String object created using new operator being referenced by the reference variable string in the memory Heap. Let’s take a look at the memory allocation when using String literal
This shows the String object being referenced by two reference variables string1, string2. When the JVM encounters the statement String string1<b>=</b>"Hello"
it creates the object in the String constant pool whose reference may be re-used when another String object with the same String literal value is requested so the statement String string2="Hello";
will not create a new object and will use the existing object in the String constant pool. Here is one example for your reference:
public class StringExample {
public static void main(String args[]) {
//creating a string by java string literal
String str1 = "javadevjournal";
//creating another Java String using new keyword
String str2 = new String("Java String example Using new keyword");
//Displaying all the strings
System.out.println(str1);
System.out.println(str2);
}
}
3. Java String Methods
Let’s take a look at some of the most important methods available in the String class. While it seems that this class is modifying the String object, but keep in mind that String class is Immutable which means cannot be modified after Initializing.
3.1 The charAt( int index) Method
Method charAt(int index) query the String for a character at a specific place. To understand, let’s take an example of this String literal.
String string="javadevjournal";
So, for the above String, the method string.charAt(2)
returns the character at index 2 which is ‘v’. Notice that the Index for strings starts from 0.
3.2 The indexOf(char c) Method
The methodindexOf()
has multiple overloaded versions which are used to get the index of the argument passed to the method.
String string="javadevjournal"
string.indexOf('v')
returns the index 2 which is the first index of ‘v ‘ stored in the string.string.indexOf('V',3)
returns the index 6, as the second argument is used to specify the start position to search which is 3.The string.indexOf("dev")
returns the starting index of substring “dev” in the string “javadevjournal” which returns the index 4. All the indexOf()
methods return -1 when the substring or the character searching for is not found.
3.3 The substring(int index) Method
This method returns the substring from the index specified until the end position of the string. Let’s take the same “javadevjournal” String for our example.The string.substring(2)
returns substring “vadevjournal”.we can also use the overloaded method with an offset in the parameter like string.substring(1,4)
which returns “ava”.Note that the second argument is the offset, not the index assuming that the string characters count to start with 1 but not with 0
3.4 The trim() Method
This method is useful to trim the leading and trailing spaces if any in the String. Let’s take following String for our example.
String string=" javadevjournal "
string.trim()
prints the output as “javadevjournal” removing the spaces at the start and end of the string. This method cannot remove spaces between the string.
3.5 The length() Method
The length()
method returns the length of the String. If we run this against our sample String “javadevjournal”, this method returns length as 14.
3.6 The contact() Method
This method is useful to concatenate the strings.Let’s take a look at the following example for better understanding.
String string="javadev"; string.concat("journal");
While running this example, it prints the output as “javadevjournal”.All the above methods return new String objects and won’t modify the existing initialized String objects as they are immutable. For example, if you print the string used in the concat()
method example after concatenating it still prints “javadev”.
Java 8 came with a number of improvement. Refer to the Java 8 StringJoiner for more detail.
Summary
In this posts, we talk about the different features of the Java String class. Strings are immutable objects and cannot be modified once initialized. String class has many built-in methods which return new String object instead of modifying the existing one. String constant pool helps avoiding java.lang.OutOfMemoryError
by using efficient memory allocation algorithm if using the same String literals. Refer to String (JDK Documentation) for more detail.