Ao programar no Android, a maioria dos valores de texto é esperada CharSequence
.
Por que é que? Qual é o benefício e quais são os principais impactos do uso CharSequence
excessivo String
?
Quais são as principais diferenças e quais problemas são esperados enquanto os utiliza e converte de um para outro?
java
string
charsequence
e-satis
fonte
fonte
Respostas:
Strings são CharSequences , então você pode simplesmente usar Strings e não se preocupar. O Android está apenas tentando ser útil, permitindo que você também especifique outros objetos CharSequence, como StringBuffers.
fonte
CharSequence
javadoc: Essa interface não refina os contratos gerais dos métodosequals
ehashCode
. O resultado da comparação de dois objetos que implementamCharSequence
é, portanto, geralmente indefinido . Cada objeto pode ser implementado por uma classe diferente e não há garantia de que cada classe será capaz de testar suas instâncias quanto à igualdade com as da outra. Portanto, é inadequado usarCharSequence
instâncias arbitrárias como elementos em um conjunto ou como chaves em um mapa.CharSequence
foi um retrofit no JDK 1.4 para introduzir uma interface comum de finalidade limitada para objetos contendo seqüências de caracteres. Alguns desses objetos contêm outro estado, portanto, pode não fazer sentido definirObject.equals
como "contém a mesma sequência de caracteres". A NIOCharBuffer
, por exemplo, apenas expõe os caracteres entreposition
elimit
comoCharSequence
, apesar de conter muitos outros caracteres.equals
/hashCode
onObject
no primeiro lugar ....Object
nem emCharSequence
nenhuma interface é necessária para garantir a igualdade entre as implementações. NãoCollection
são necessários dois s para fornecer igualdade entre aCollection
interface, mas eles podem se assim o desejarem. O IMHOCharSequence
deve ser limitado a entradas e usado menos para tipos de retorno.CharSequence
= interfaceString
= implementação concretaCharSequence
é uma interface .String
é uma dessas classes, uma implementação concreta deCharSequence
.Você disse:
Não há como converter
String
.String
objeto é umCharSequence
.CharSequence
pode produzir umString
. LigueCharSequence::toString
. Se porCharSequence
acaso for aString
, o método retornará uma referência ao seu próprio objeto.Em outras palavras, cada
String
um é umCharSequence
, mas nem todoCharSequence
é umString
.Programação para uma interface
Geralmente, programar para uma interface é melhor do que programar para classes concretas. Isso gera flexibilidade, para que possamos alternar entre implementações concretas de uma interface específica sem quebrar outro código.
Ao desenvolver uma API para ser usada por vários programadores em várias situações, escreva seu código para fornecer e receber as interfaces mais gerais possíveis. Isso dá ao programador chamador a liberdade de usar várias implementações dessa interface, o que for melhor para o seu contexto particular.
Por exemplo, veja o Java Collections Framework . Se a sua API dá ou toma uma coleção ordenada de objetos, declarar seus métodos como a utilização
List
, em vez deArrayList
,LinkedList
ou qualquer outra aplicação 3-parte deList
.Ao escrever um pequeno método rápido e sujo para ser usado apenas pelo seu código em um local específico, em vez de escrever uma API para ser usada em vários locais, você não precisa se preocupar em usar a interface mais geral em vez de um concreto específico classe. Mas, mesmo assim, é demais usar a interface mais geral possível.
String
você sabe que possui um único pedaço de texto, inteiramente na memória e é imutável.CharSequence
, você não sabe quais podem ser os recursos específicos da implementação concreta.O
CharSequence
objeto pode representar um pedaço enorme de texto e, portanto, tem implicações de memória. Ou pode haver muitos pedaços de texto rastreados separadamente que precisarão ser agrupados quando você ligartoString
e, portanto, apresentar problemas de desempenho. A implementação pode até estar recuperando texto de um serviço remoto e, portanto, tem implicações de latência.Você geralmente não estará convertendo para frente e para trás. A
String
é aCharSequence
. Se o seu método declarar que é necessário aCharSequence
, o programador de chamada pode passar umString
objeto ou pode passar algo como umStringBuffer
ouStringBuilder
. O código do seu método simplesmente usará o que for passado, chamando qualquer um dosCharSequence
métodos.O mais próximo que você chegaria da conversão é se o seu código receber um
CharSequence
e você souber que precisa de umString
. Talvez você esteja fazendo interface com o código antigo gravado naString
classe, em vez de gravado naCharSequence
interface. Ou talvez seu código funcione intensivamente com o texto, como repetir repetidamente ou analisar de outra forma. Nesse caso, você deseja obter qualquer resultado de desempenho possível apenas uma vez, para ligartoString
com antecedência. Em seguida, continue seu trabalho usando o que você sabe ser um único pedaço de texto inteiramente na memória.História distorcida
Observe os comentários feitos na resposta aceita . A
CharSequence
interface foi adaptada às estruturas de classes existentes, portanto, existem algumas sutilezas importantes (equals()
&hashCode()
). Observe as várias versões do Java (1, 2, 4 e 5) marcadas nas classes / interfaces - um pouco de agitação ao longo dos anos. O idealCharSequence
seria estar em vigor desde o início, mas essa é a vida.Meu diagrama de classes abaixo pode ajudá-lo a ver o panorama geral dos tipos de string no Java 7/8. Não tenho certeza se todos eles estão presentes no Android, mas o contexto geral ainda pode ser útil para você.
fonte
Eu acredito que é melhor usar CharSequence. O motivo é que String implementa CharSequence, portanto, você pode passar uma String para uma CharSequence, no entanto, você não pode passar uma CharSequence para uma String, pois CharSequence não implementa String. TAMBÉM, no Android, o
EditText.getText()
método retorna um Editável, que também implementa CharSequence e pode ser passado facilmente para um, enquanto não facilmente para uma String. CharSequence lida com todos!fonte
charSequence.toString()
Em geral, o uso de uma interface permite variar a implementação com o mínimo de danos colaterais. Embora o java.lang.String seja super popular, pode ser possível que, em certos contextos, alguém queira usar outra implementação. Ao criar a API em torno de CharSequences em vez de Strings, o código oferece a oportunidade de fazer isso.
fonte
Este é quase certamente motivos de desempenho. Por exemplo, imagine um analisador que passe por um ByteBuffer de 500k contendo seqüências de caracteres.
Existem 3 abordagens para retornar o conteúdo da string:
Crie uma String [] no momento da análise, um caractere de cada vez. Isso levará um tempo notável. Podemos usar == em vez de .equals para comparar referências em cache.
Crie um int [] com deslocamentos no momento da análise e, em seguida, crie String dinamicamente quando ocorrer um get (). Cada String será um novo objeto, portanto, nenhum cache retornará valores e usar ==
Crie um CharSequence [] no momento da análise. Como nenhum dado novo é armazenado (exceto deslocamentos no buffer de bytes), a análise é muito menor que o número 1. Na hora de obter tempo, não precisamos criar uma String, portanto, obter desempenho é igual a # 1 (muito melhor que # 2), pois estamos retornando apenas uma referência a um objeto existente.
Além dos ganhos de processamento obtidos com o CharSequence, você também reduz o espaço ocupado pela memória ao não duplicar os dados. Por exemplo, se você possui um buffer contendo 3 parágrafos de texto e deseja retornar todos os 3 ou um único parágrafo, precisará de 4 Strings para representar isso. Usando o CharSequence, você só precisa de 1 buffer com os dados e 4 instâncias de uma implementação do CharSequence que rastreie o início e a duração.
fonte
CharSequence
implementação para isso.CharSequence
é uma interface - por definição, ele não possui nenhum dos detalhes de implementação discutidos porque não possui uma implementação própria. AString
é uma das várias classes concretas que implementam aCharSequence
interface. Então aString
é aCharSequence
. Você pode comparar os detalhes de desempenho deString
vsStringBuffer
vsStringBuilder
, mas nãoCharSequence
. Escrever "ganhos de processamento obtidos com o CharSequence" não faz sentido.Um problema que surge no código prático do Android é que compará-los com o CharSequence.equals é válido, mas não necessariamente funciona conforme o esperado.
A comparação deve ser feita por
fonte
CharSequence
A
CharSequence
é uma interface, não uma classe real. Uma interface é apenas um conjunto de regras (métodos) que uma classe deve conter se implementar a interface. No Android, aCharSequence
é um guarda-chuva para vários tipos de cadeias de texto. Aqui estão alguns dos mais comuns:String
(texto imutável sem extensões de estilo)StringBuilder
(texto mutável sem extensões de estilo)SpannableString
(texto imutável com extensões de estilo)SpannableStringBuilder
(texto mutável com extensões de estilo)(Você pode ler mais sobre as diferenças entre elas aqui .)
Se você tem um
CharSequence
objeto, na verdade, é um objeto de uma das classes que implementamCharSequence
. Por exemplo:A vantagem de ter um tipo geral de guarda-chuva
CharSequence
é que você pode lidar com vários tipos com um único método. Por exemplo, se eu tiver um método que use aCharSequence
como parâmetro, eu poderia passar umString
ou umSpannableStringBuilder
e ele lidaria com qualquer um deles.Corda
Você poderia dizer que a
String
é apenas um tipo deCharSequence
. No entanto, ao contrárioCharSequence
, é uma classe real, então você pode criar objetos a partir dela. Então você pode fazer isso:mas você não pode fazer isso:
Como
CharSequence
é apenas uma lista de regras emString
conformidade, você pode fazer o seguinte:Isso significa que sempre que um método pede a
CharSequence
, é bom atribuir aString
.No entanto, o oposto não é verdadeiro. Se o método usa um
String
parâmetro, você não pode transmitir algo que geralmente é conhecido como aCharSequence
, porque pode ser realmente umSpannableString
ou outro tipo deCharSequence
.fonte
CharSequence
é uma interface e aString
implementa. Você pode instanciar um,String
mas não o pôde fazer,CharSequence
pois é uma interface. Você pode encontrar outras implementações noCharSequence
site oficial do Java.fonte
CharSequence é uma sequência legível de valores de caracteres que implementa String. tem 4 métodos
Consulte a documentação CharSequence
fonte
CharSequence
não implementaString
. O contrário é verdade, no entanto.