CharSequence vs. String em Java
1. Introdução
Simplificando,CharSequenceeString são dois conceitos fundamentais diferentes em Java.
Neste artigo rápido, vamos dar uma olhada nas diferenças entre esses tipos e quando usar cada um.
2. CharSequence
CharSequence é uma interface que representa uma sequência de caracteres. A mutabilidade não é imposta por essa interface. Portanto, as classes mutáveis e imutáveis implementam essa interface.
Obviamente, uma interface não pode ser instanciada diretamente; ele precisa de uma implementação para instanciar uma variável:
CharSequence charSequence = "example";
Aqui,charSequence é instanciado com umString. Instanciando outras implementações:
CharSequence charSequence = new StringBuffer("example");
CharSequence charSequence = new StringBuilder("example");
3. String
String é uma sequência de caracteres em Java. É uma classe imutável e um dos tipos mais usados em Java. Esta classe implementa as interfacesCharSequence,Serializable eComparable<String>.
Abaixo de ambas as instanciações, crieStrings com o mesmo conteúdo. No entanto, eles não são iguais entre si:
@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
CharSequence firstString = "example";
String secondString = "example";
assertNotEquals(firstString, secondString);
}
4. CharSequence vs. String
Vamos comparar as diferenças e semelhanças deCharSequenceeString. Ambos residem no mesmo pacote denominadojava.lang., mas o primeiro é uma interface e o último é uma classe concreta. Além disso, a classeString é imutável.
No exemplo a seguir, cada operação de soma cria outra instância, aumenta a quantidade de dados armazenados e retorna oString: criado mais recentemente
@Test
public void givenString_whenAppended_thenUnmodified() {
String test = "a";
int firstAddressOfTest = System.identityHashCode(test);
test += "b";
int secondAddressOfTest = System.identityHashCode(test);
assertNotEquals(firstAddressOfTest, secondAddressOfTest);
}
Por outro lado,StringBuilder atualiza oString já criado para manter o novo valor:
@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);
}
Outra diferença é que a interface não implica em uma estratégia de comparação embutida, enquanto a classeString implementa a interfaceComparable<String>.
Para comparar doisCharSequences, podemos convertê-los emStrings e posteriormente compará-los:
@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
CharSequence charSeq1 = "example_1";
CharSequence charSeq2 = "example_2";
assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}
5. Conclusão
Normalmente usamosString nos lugares onde não temos certeza do que usar para sequências de caracteres. No entanto, em alguns casos,StringBuildereStringBuffer podem ser mais apropriados.
Você pode encontrar mais informações em JavaDocs sobreCharSequenceeString.
E, como sempre, a implementação de todos esses exemplos e trechos de código pode ser encontradaover on Github.