Рубрики
Без рубрики

CharSequence против Строка в Java

Изучите различия между CharSequence и String.

Автор оригинала: baeldung.

1. введение

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

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

2. Последовательность

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

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

CharSequence charSequence = "baeldung";

Здесь CharSequence создается с помощью строки . Создание экземпляров других реализаций:

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

3. Строка

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

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

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

    assertNotEquals(firstString, secondString);
}

4. CharSequence против Строка

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

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

@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 обновляет уже созданную строку , чтобы сохранить новое значение:

@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 .

Чтобы сравнить два CharSequence s, мы можем привести их к String s, а затем сравнить их:

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

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

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

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

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