CharSequence срещу String в Java

1. Въведение

Най-просто казано, CharSequence и String са две различни основни концепции в Java.

В тази кратка статия ще разгледаме разликите между тези типове и кога да използваме всеки от тях.

2. CharSequence

CharSequence е интерфейс, който представлява последователност от символи. Изменяемостта не се налага от този интерфейс. Следователно, както изменяеми, така и неизменяеми класове изпълняват този интерфейс.

Разбира се, интерфейс не може да бъде директно създаден; тя се нуждае от изпълнение, за да създаде променлива:

CharSequence charSequence = "baeldung";

Тук charSequence се създава с String. Инсталиране на други изпълнения:

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

3. Струна

String е последователност от символи в Java. Това е неизменен клас и един от най-често използваните типове в Java. Този клас изпълнява интерфейсите CharSequence , Serializable и Comparable .

Под двете инстанции създайте низове с едно и също съдържание. Те обаче не са равни помежду си:

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

4. CharSequence срещу 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 изпълнява сравнимия интерфейс.

За да сравним две 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.