Java String.docx
Java String.docx
In Java, string is basically an object that represents sequence of char values. An array of
characters works same as Java string. For example:
CharSequence Interface
The Java String is immutable which means it cannot be changed. Whenever we change any
string, a new instance is created. For mutable strings, you can use StringBuffer and StringBuilder
classes.
We will discuss immutable string later. Let's first understand what String in Java is and how to
create the String object.
Generally, String is a sequence of characters. But in Java, string is an object that represents a
sequence of characters. The java.lang.String class is used to create a string object.
1) String Literal
In the above example, only one object will be created. Firstly, JVM will not find any string
object with the value "Welcome" in string constant pool that is why it will create a new object.
After that it will find the string with the value "Welcome" in the pool, it will not create a new
object but will return the reference to the same instance.
Note: String objects are stored in a special memory area known as the "string constant pool".
To make Java more memory efficient (because no new objects are created if it exists already in
the string constant pool).
2) By new keyword
1. String s=new String("Welcome");//creates two objects and one reference variable
In such 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 a heap (non-pool).
In Java, both String and CharBuffer interact with sequences of characters, but they are designed
with different use cases and underlying mechanisms in mind. Here's an exploration of their
interfaces, classes, and how they fit into the Java ecosystem.
String
The String class is one of the most fundamental types in Java, designed to represent immutable
sequences of characters. Here's a closer look at its characteristics and the interfaces it
implements:
CharBuffer
CharBuffer, on the other hand, is part of the java.nio (New Input/Output) package, which
provides a set of classes for non-blocking I/O operations. CharBuffer is a mutable sequence of
characters with more flexibility for manipulation. Here's more about CharBuffer:
o Mutability and Direct Buffers: Unlike strings, CharBuffer instances can be modified.
They can be either heap-based or direct buffers. Direct buffers can offer higher
performance, especially for I/O operations, as they are managed outside the Java heap
and interact directly with the operating system's native I/O operations.
o Implemented Interfaces: CharBuffer extends the Buffer class and implements
the CharSequence, Appendable, Comparable<CharBuffer>, and Readable interfaces,
providing a rich set of functionalities for character sequence manipulation, comparison,
and reading operations.
o Usage Scenarios: It is particularly useful for reading and writing to channels, regular
expressions, and character processing in a more efficient manner, especially when dealing
with large datasets or requiring fine-grained control over character data.
CharSequence Interface
Java's CharSequence interface provides a unified, read-only view of character sequences and is a
component of the java.lang package. It facilitates consistent access and manipulation across
various types of character sequences, including String, StringBuilder, StringBuffer, and
CharBuffer. Through this interface, key functionalities for handling character data are defined,
enabling actions like measuring sequence length, accessing particular characters, generating
character subsequences, and transforming into a String format. By providing a common blueprint
for character sequences, `CharSequence` enables flexible and implementation-independent text
processing across the Java platform.
1. String
2. StringBuffer
3. StringBuilder
String
In Java, the String class encapsulates a series of characters. Once instantiated, a String object's
content is fixed and cannot be modified, attributing to its immutable nature. This immutability
ensures that String objects are safe for concurrent use across threads and are optimally
performant in situations where the textual content remains constant. To enhance memory
efficiency, Java employs a technique called string interning. This approach optimizes the storage
and access of commonly utilized string literals.
Syntax:
StringBuffer
StringBuffer represents a mutable sequence of characters that ensures thread safety, making it
suitable for scenarios involving multiple threads that modify a character sequence. It includes
various string manipulation capabilities, including the ability to insert, delete, and append
characters. This design avoids the necessity of generating new objects with each change, leading
to enhanced efficiency in situations requiring regular adjustments to the string content.
Syntax
Hello, World!
StringBuilder
StringBuilder shares similarities with StringBuffer by being a mutable character sequence. The
crucial distinction lies in StringBuilder not being synchronized, rendering it not suitable for
thread-safe operations. This absence of synchronization, though, contributes to StringBuilder
offering superior performance in environments that are single-threaded or confined to a specific
thread. As a result, StringBuilder becomes the favored option for manipulating strings in
contexts where the safety of concurrent thread access is not an issue.
Syntax
Hello, World!
StringTokenizer
StringJoiner in Java
StringJoiner is a class introduced in Java 8 (in java.util package) that provides an efficient way
to concatenate strings with a specified delimiter, optional prefix, and suffix.
StringJoiner simplifies this by automatically handling delimiters, prefixes, and suffixes while
joining multiple strings.
Java's StringTokenizer class, housed within the java.util package, simplifies the process of
segmenting a string into multiple tokens, utilizing designated separators. This class is
exceptionally beneficial for parsing strings and navigating through their tokens, especially in
scenarios involving user inputs, file contents, or network transmissions formatted with
straightforward separators such as commas, spaces, or tabs. It offers an efficient means to dissect
and examine the tokenized segments of a string, catering to situations that demand basic parsing
capabilities.
The StringTokenizer class implements the Enumeration<Object> interface, allowing the tokens
of the string to be iterated like other enumeration types in Java. It offers a straightforward
approach to tokenization, avoiding the need for more complex regular expressions, making it
suitable for simple parsing needs.
Syntax:
In Java, strings are immutable. It means that its value cannot be changed once a String object is
created. If any operation appears to modify a String, what happens is the creation of a new String
object. The original string remains unchanged. This immutable characteristic of strings in Java
has several implications for performance, security, and functionality.
Filename: ImmutableStringExample.java
Memory allotment for strings in Java is interesting due to Java's handling of string immutability
and the string pool mechanism. Understanding how strings are stored can help optimize memory
usage in Java applications, especially those that heavily use string manipulations.
String Literal Storage: When you create a string using string literals, Java checks the string
pool first. The new variable points to the existing string if it already exists. If it doesn't exist, the
new string is added to the Pool, and the variable points to this new string.
Syntax:
1. String s1 = "Hello"; // String literal
2. String s2 = "Hello"; // Points to the same "Hello" in the Pool as s1
new Keyword and String Pool: Strings created with the new operator do not use the Pool by
default. They are stored in the heap memory outside the Pool, which means each new operation
results in a new object, even if it contains the same string data.
Syntax:
1. String s3 = new String("Hello"); // A new string object is created in the heap
Interning: We can manually add a string to the Pool or ensure it uses the Pool by calling
the intern() method on a string object. If the Pool already contains an equal string, the string
from the Pool is returned. Otherwise, the string is added to the Pool.
Syntax:
PermGen (Permanent Generation) was a special memory area in the Java heap space that
stored metadata about Java classes, methods, and interned strings. It was used until Java 7 and
was replaced by Metaspace in Java 8.
Why did the String pool move from PermGen to the normal heap area?
Java 8 introduced a notable shift in memory management within the Java Virtual Machine (JVM)
by moving the String Pool from the Permanent Generation (PermGen) to the general heap space.
This adjustment was a key element of a wider effort to improve memory utilization, ease the
management and configuration of memory, and boost the efficiency and scalability of Java-based
applications. To fully comprehend the significance of this change, it's important to understand
both the constraints associated with PermGen and the advantages that stem from transferring the
String Pool and additional metadata to the heap area.
Syntax:
Interned String and Literal String refer to the same object: true
In Java, creating a String based on a portion of a char array is achievable through a specific
constructor in the String class. This constructor requires three parameters: the char array to be
used, an index indicating the starting point of the desired subset, and the count of characters to
encompass in the subset. Here's the syntax and an example:
Syntax:
1. String(char[] value, int offset, int count)
Filename: CharArrayToString.java
World
StringExample.java
java
strings
example
The above code, converts a char array into a String object. And displays the String objects s1,
s2, and s3 on console using println() method.
The java.lang.String class provides many useful methods to perform operations on sequence of
char values.
static String
8 join(CharSequence delimiter, It returns a joined string.
CharSequence... elements)
static String
join(CharSequence delimiter,
9 It returns a joined string.
Iterable<? extends
CharSequence> elements)
static String
It compares another string. It
15 equalsIgnoreCase(String
doesn't check case.
another)
A String is an unavoidable type of variable while writing any application program. String
references are used to store various attributes like username, password, etc. 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.
Let's try to understand the concept of immutability by the example given below:
Testimmutablestring.java
Sachin
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 above 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:
Testimmutablestring1.java
As Java uses the concept of String literal. Suppose there are 5 reference variables, all refer to one
object "Sachin". If one reference variable changes the value of the object, it will be affected by
all the reference variables. That is why String objects are immutable in Java.
Following are some features of String which makes String objects immutable.
1. ClassLoader:
A ClassLoader in Java uses a String object as an argument. Consider, if the String object is
modifiable, the value might be changed and the class that is supposed to be loaded might be
different.
2. Thread Safe:
As the String object is immutable we don't have to take care of the synchronization that is
required while sharing an object across multiple threads.
3. Security:
As we have seen in class loading, immutable String objects avoid further errors by loading the
correct class. This leads to making the application program more secure. Consider an example of
banking software. The username and password cannot be modified by any intruder because
String objects are immutable. This can make the application program more secure.
4. Heap Space:
The immutability of String helps to minimize the usage in the heap memory. When we try to
declare a new String object, the JVM checks whether the value already exists in the String pool
or not. If it exists, the same value is assigned to the new object. This feature allows Java to use
the heap space efficiently.
The reason behind the String class being final is because no one can override the methods of the
String class. So that it can provide the same features to the new String objects as well as to the
old ones.
String comparison is a key component of Java programming and is used extensively in reference
matching, sorting, and authentication. In this section, we will discuss various ways to compare
string in Java.
String comparision used in authentication (by the equals() method), sorting (by the compareTo()
method), reference matching (by the == operator), etc.
o public boolean equals(Object another) compares this string to the specified object.
o public boolean equalsIgnoreCase(String another) compares this string to another
string, ignoring case.
StringComparisonUsingEqualsMethod.java
true
true
false
Explanation
S1 and S2 relate to the same string pool object since they are string literals. As a result,
s1.equals(s2) gives true. Despite S3 being developed with the new keyword, S1 and S3 had the
same content. Since only the content is compared using the equals() method, s1.equals(s3) is
true; however, s1.equals(s4) is false because the contents of s1 and s4 differ.
In the above program, the methods of String class are used. The equals() method returns true if
String objects are matching and both strings are of same case. equalsIgnoreCase() returns true
regardless of cases of strings.
StringComparisonUsingequalsIgnoreCase.java
false
true
Explanation
There are two strings specified, s1 and s2, with distinct cases ("Ram" and "rAm").
Use the equals() function to compare s1 and s2. Because the cases are different, this method
compares them in a case-sensitive fashion and returns false.
The comparison between strings s1 and s2 is performed using the equalsIgnoreCase() function.
Because it treats the material equally and ignores case distinctions, this function returns true.
2) By Using == Operator
StringCompare.java
true
false
The String class compareTo() method compares values lexicographically and returns an integer
value that describes if first string is less than, equal to or greater than second string.
0
1
-1
Explanation
The content of str1 and str2 is the same-"Sachin," while str3 has the word "Ratan."
If a string starts with a prefix and ends with a suffix, respectively, it may be determined using the
methods startsWith() and endsWith().
true
true
Explanation
startsWith("Hello") returns true if the string begins with the given prefix.
endsWith("World!") returns true if the string does, in fact, conclude with the designated suffix.
Conclusion
In summy, the compareTo() function offers a means of comparing strings according to their
lexicographical order. Developers can ascertain the ordering relationship between two strings by
comprearhending the return values (0, positive, or negative). The example shows the method's
behavior with various string inputs.