In Java, is a String an array of chars?
Categories:
Is a Java String an Array of Chars? Unpacking String Internals

Explore the fundamental nature of Java Strings, their relationship to character arrays, and how their immutability impacts programming practices.
In Java, the String
class is one of the most frequently used data types. A common question, especially for those new to the language, is whether a String
is simply an array of characters (char[]
). While there's a close relationship, the answer is more nuanced than a simple 'yes' or 'no'. Understanding this distinction is crucial for writing efficient and secure Java code.
The Internal Representation of a String
Historically, a Java String
was indeed backed by a char[]
array. This was the case up to Java 8. However, with Java 9 and later versions, the internal representation changed to optimize memory usage. For strings containing only characters that fit within a single byte (like Latin-1 characters), String
now uses a byte[]
array. For strings with characters requiring two bytes (like many Unicode characters), it still uses a char[]
(which is effectively a byte[]
with a different encoding flag). This optimization is transparent to the developer, but it highlights that the internal backing array is an implementation detail that can change.
classDiagram class String { - byte[] value - byte coder + int length() + char charAt(int index) + String substring(int beginIndex, int endIndex) + String concat(String str) + char[] toCharArray() } class charArray { char[] elements } class byteArray { byte[] elements } String "1" -- "0..1" charArray : (Java 8 and earlier) String "1" -- "0..1" byteArray : (Java 9+ for Latin-1) String "1" -- "0..1" charArray : (Java 9+ for UTF-16) note for String "Internal representation changed in Java 9 for memory optimization"
Class diagram illustrating the internal backing of Java's String
class across different Java versions.
Immutability: The Key Difference
The most significant difference between a String
and a char[]
is immutability. Once a String
object is created, its content cannot be changed. Any operation that appears to modify a String
(like concatenation or substring extraction) actually creates a new String
object. In contrast, a char[]
is mutable; you can change individual characters within the array after it has been created.
public class StringVsCharArray {
public static void main(String[] args) {
// String is immutable
String s1 = "Hello";
String s2 = s1.concat(" World"); // Creates a NEW String object
System.out.println("s1: " + s1); // Output: Hello (s1 remains unchanged)
System.out.println("s2: " + s2); // Output: Hello World
// char array is mutable
char[] charArray = {'J', 'a', 'v', 'a'};
System.out.println("Original charArray: " + new String(charArray));
charArray[0] = 'L'; // Modifies the array in place
System.out.println("Modified charArray: " + new String(charArray)); // Output: Lava
}
}
Demonstration of String immutability versus char array mutability.
String
objects are immutable, they are inherently thread-safe and can be safely shared across multiple threads without external synchronization. This is a major advantage for concurrent programming.Why Immutability Matters
Immutability provides several benefits:
- Security: Strings are often used to store sensitive information like passwords or file paths. If strings were mutable, their content could be altered unexpectedly, leading to security vulnerabilities.
- Thread Safety: As mentioned, immutable objects are automatically thread-safe, simplifying concurrent programming.
- Performance: String literals are pooled in the 'String Pool' (a special area in the heap). Because they are immutable, the JVM can optimize memory usage by having multiple
String
references point to the same literal value without fear of one reference modifying the others. - Hashing:
String
objects are frequently used as keys inHashMap
andHashSet
. Their immutability guarantees that their hash code remains constant throughout their lifetime, which is essential for the correct functioning of hash-based collections.
Converting Between String and char[]
While a String
isn't just a char[]
, Java provides convenient ways to convert between them when needed. You can convert a String
to a char[]
using the toCharArray()
method, and you can create a String
from a char[]
using a String
constructor.
public class StringConversion {
public static void main(String[] args) {
// String to char array
String myString = "Example";
char[] charsFromString = myString.toCharArray();
System.out.print("Chars from String: ");
for (char c : charsFromString) {
System.out.print(c + " ");
}
System.out.println();
// char array to String
char[] charArray = {'C', 'o', 'd', 'e', 'r'};
String stringFromChars = new String(charArray);
System.out.println("String from chars: " + stringFromChars);
// Another way to create String from char array (subset)
String partialString = new String(charArray, 1, 3); // From index 1, 3 characters
System.out.println("Partial String from chars: " + partialString); // Output: ode
}
}
Converting between String
and char[]
.
String
to a char[]
for security reasons, remember to explicitly clear the char[]
(e.g., by filling it with zeros) after use to prevent the password from lingering in memory. String
objects, due to immutability and pooling, are harder to securely erase.