CharSequence или String в Java

CharSequence vs. Строка в Java

1. Вступление

Проще говоря,CharSequence иString - это две разные фундаментальные концепции в Java.

В этой быстрой статье мы рассмотрим различия между этими типами и расскажем, когда использовать каждый из них.

2. CharSequenceс

CharSequence - это интерфейс, представляющий последовательность символов. Изменчивость не обеспечивается этим интерфейсом. Следовательно, как изменяемые, так и неизменяемые классы реализуют этот интерфейс.

Конечно, интерфейс нельзя создать напрямую; ему нужна реализация для создания переменной:

CharSequence charSequence = "example";

ЗдесьcharSequence создается с помощьюString., создавая другие реализации:

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

3. Stringс

String - это последовательность символов в Java. Это неизменный класс и один из наиболее часто используемых типов в Java. Этот класс реализует интерфейсыCharSequence,Serializable иComparable<String>.

Ниже оба экземпляра создаютStrings с одинаковым содержимым. Однако они не равны друг другу:

@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
    CharSequence firstString = "example";
    String secondString = "example";

    assertNotEquals(firstString, secondString);
}

4. CharSequence vs. String

Давайте сравним различия и сходстваCharSequence иString. Оба они находятся в одном пакете с именемjava.lang., но первый является интерфейсом, а второй - конкретным классом. Более того, классString неизменен.

В следующем примере каждая операция суммирования создает еще один экземпляр, увеличивает объем хранимых данных и возвращает последний созданныйString:

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

    assertNotEquals(firstAddressOfTest, secondAddressOfTest);
}

С другой стороны,StringBuilder обновляет уже созданныйString, чтобы сохранить новое значение:

@Test
public void givenStringBuilder_whenAppended_thenModified() {
    StringBuilder test = new StringBuilder();
    test.append("a");
    int firstAddressOfTest = System.identityHashCode(test);
    test.append("b");
    int secondAddressOfTest = System.identityHashCode(test);

    assertEquals(firstAddressOfTest, secondAddressOfTest);
}

Другое отличие состоит в том, что интерфейс не подразумевает встроенной стратегии сравнения, тогда как классString реализует интерфейсComparable<String>.

Чтобы сравнить дваCharSequences, мы можем преобразовать их вStrings, а затем сравнить их:

@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "example_1";
    CharSequence charSeq2 = "example_2";

    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}

5. Заключение

Обычно мы используемString там, где мы не уверены, что использовать для последовательностей символов. Однако в некоторых случаяхStringBuilder иStringBuffer могут быть более подходящими.

Вы можете найти дополнительную информацию в JavaDocs оCharSequence иString.

И, как всегда, реализацию всех этих примеров и фрагментов кода можно найтиover on Github.