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 .