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.