Expand Authors Top

If you have a few years of experience in the Java ecosystem and you’d like to share that with the community, have a look at our Contribution Guidelines.

Expanded Audience – Frontegg – Security (partner)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

November Discount Launch 2022 – Top
We’re finally running a Black Friday launch. All Courses are 30% off until the end of this week:


November Discount Launch 2022 – TEMP TOP (NPI)
We’re finally running a Black Friday launch. All Courses are 30% off until the end of this week:


1. Introduction

Simply put, CharSequence and String are two different fundamental concepts in Java.

In this quick article, we're going to have a look at the differences between these types and when to use each one.

2. CharSequence

CharSequence is an interface that represents a sequence of characters. Mutability is not enforced by this interface. Therefore, both mutable and immutable classes implement this interface.

Of course, an interface can't be instantiated directly; it needs an implementation to instantiate a variable:

CharSequence charSequence = "baeldung";

Here, charSequence is instantiated with a String. Instantiating other implementations:

CharSequence charSequence = new StringBuffer("baeldung");
CharSequence charSequence = new StringBuilder("baeldung");

3. String

String is a sequence of characters in Java. It is an immutable class and one of the most frequently used types in Java. This class implements the CharSequence, Serializable, and Comparable<String> interfaces.

Below both instantiations create Strings with the same content. However, they are not equal to each other:

public void givenUsingString_whenInstantiatingString_thenWrong() {
    CharSequence firstString = "baeldung";
    String secondString = "baeldung";

    assertNotEquals(firstString, secondString);

4. CharSequence vs. String

Let's compare the differences and commonalities of CharSequence and String. They both reside in the same package named java.lang., but the former is an interface and latter is a concrete class. Moreover, the String class is immutable.

In the following example, each sum operation creates another instance, increases the amount of data stored and returns the most recently created String:

public void givenString_whenAppended_thenUnmodified() {
    String test = "a";
    int firstAddressOfTest = System.identityHashCode(test);
    test += "b";
    int secondAddressOfTest = System.identityHashCode(test);

    assertNotEquals(firstAddressOfTest, secondAddressOfTest);

On the other hand, StringBuilder updates the already created String to hold the new value:

public void givenStringBuilder_whenAppended_thenModified() {
    StringBuilder test = new StringBuilder();
    int firstAddressOfTest = System.identityHashCode(test);
    int secondAddressOfTest = System.identityHashCode(test);        
    assertEquals(firstAddressOfTest, secondAddressOfTest);

Another difference is that the interface does not imply a built-in comparison strategy, whereas the String class implements the Comparable<String> interface.

To compare two CharSequences, we can cast them to Strings then subsequently compare them:

public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "baeldung_1";
    CharSequence charSeq2 = "baeldung_2";
    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);

5. Conclusion

We usually use String in the places where we're not sure what to use for char sequences. However, in some cases, StringBuilder and StringBuffer can be more appropriate.

You can find more information in JavaDocs about CharSequence and String.

And, as always, the implementation of all these examples and code snippets can be found over on Github.

November Discount Launch 2022 – Bottom
We’re finally running a Black Friday launch. All Courses are 30% off until the end of this week:


Generic footer banner
Comments are closed on this article!