Como comparar string com uma letra java

Recentemente num projeto Android, eu cai na armadilha de comparar duas Strings com operador == e por não testar o código (nunca repitam isso crianças), o tiro acabou saindo pela culatra. Por esse motivo resolvi escrever esse artigo para explicar como comparar Strings em Java da forma correta. Então bora lá…

Essa foi a linha de código que me deu dor de barriga:

if (anoBat == "0") { ... }

É uma simples condição onde comparo um variável (do tipo String) com um uma outra String literal. Simples né? Num primeiro momento talvez você ache que retorne TRUE correto? Porém não foi isso que aconteceu… 😭

Vamos as explicações!

Uma coisa que precisa ficar bem claro: String em Java é um objeto!

O Java utiliza um mecanismo chamado String Interning. Ele armazena num pool de memória apenas uma cópia de cada valor distinto de String (que deve ser imutável).

Esse conjunto de caracteres literais formam uma instancia de String. Logo é possível comprar duas VARIÁVEIS do tipo String com o operador ==

String a = "str"; String b = "str"; System.out.printLn(a == b); // retorna TRUE

Porém não é inteligente confiar nesse operador de comparação uma vez que não sabemos como a String foi instanciada, por exemplo:

String a = "str"; String b = "string"; String c = b.substring(0,3); // c:"str" System.out.printLn(a == c); // retorna FALSE

Mas porque retornou FALSE? 🤔

No código acima foi criada uma NOVA instância de String, que não é a mesma retornada pela JVM para o literal “str”. (Lembre-se, cada instância de objeto tem um identificador único)

Apesar de existir duas instâncias distintas, lá no pool de memória continua existindo apenas uma entrada (imutável) para “str”.

Tá certo, mas como validar isso? Existe o método String.intern() que retorna uma referência para a String que está no pool. Exemplo:

String a = "str"; String b = "string"; String c = b.substring(0,3); // c:"str" System.out.printLn(a == c.intern()); // retorna TRUE

Legal né? Mas nem tudo são flores…

Mas e o tal do equals()?

Em resumo o método equals() simplesmente compara a estrutura entre dois objetos (em nosso caso os caracteres literais), sem a necessidade de atribuir novos valores (ou ter acesso) ao pool.

A comparação com == é mais rápida que utilizando o método equals(), porém não é sábio (nem recomendado) usar intern(). Saca só:

Nem todas as Strings são armazenadas no pool imediatamente. Quando chamamos o método intern(), caso a String ainda não exista, o Java vai acrescenta-la ao pool. O PROBLEMA é que uma vez no pool essa String vai para a memória permanente e não será mais coletada pelo garbage collector.

Se você usar incansavelmente o intern(), em processamentos pouco mais pesados como arquivos de texto, XML, banco de dados, é bem provável que você possa ter um estouro de pilha (OutOfMemoryError).

Então o que usar?

SEMPRE que for comparar duas Strings use o método equals(). Simples assim. Você evita muita dor de cabeça desnecessária. 😁

String a = "str"; System.out.printLn(a.equals("str")); // retorna TRUE

E aí curtiu? Conseguiu clarear as idéias? Deixe sua opinião logo abaixo, me fala se já passou por algo parecido e como foi combinado? 👊

Olha aí eu preciso comparar um string que eu passo como parâmetro com vários tipos de caracteres, tipo: ‘!’, ‘#’, ‘@’… Como eu faço no Java??

Mas vc quer comparar como?
Se é igual a algum caracter?

[code]
String a = “aaa”;

if ( a.equals( String.valueOf( ‘#’ ) ) {

// a é igual a #

}[/code]

Ou você pode pegar cada caractere da String e comparar:

[code]String s = “Java”;

for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == ‘a’) System.out.printnl(“s[” + i + “] = a” );

}[/code]

hehe Valeu DIEGO2005 ERA ISSO MESMO QUE EU PRECISAVA…QUASE CHEGUEI LÁ, MAS COM SUA DICA DEU CERTO…VALEU MESTRE

OLHA AÍ O CÓDIGO!!!

[code]public void verificaNome() {

String aux = nomediscip;

if(aux.length() > 15) { System.out.println("Nome da disciplina excede o limite de 15 caracteres"); } for(int i=0; i < aux.length(); i++) { if(aux.charAt(i) == '!') System.out.println("erro de caracter"); } }

[/code]
VALEU A ATENÇÃO AÍ DAVIDBUZATTO!!

Que tal aprender um pouco sobre expressoes regulares? Resolve seu problema de forma bem mais facil

Como comparar string com uma letra java

Como eu faço para comparar 2 String e saber qual vem primeiro (ordem alfabetica).Espero que alguem possa me ajudar, pois nao tenho a menor ideia de como fazer.

Você pode utilizar os métodos compareTo(String) e compareToIgnoreCase(String), esses métodos retornar <= -1 se a string vier antes, 0 se for igual e >= +1 se vier depois. O problema destes métodos é que não são locale-sensitive, já que certos idiomas como o espanhol, tem uma letra compostas por dois caracteres, como por ex, o ‘ll’. Para resolver esse problema dê uma olhada na classe java.util.Collator

1 curtida

Utilize o método compareTo da classe String.

Exemplo:

String str1 = "A"; String str2 = "B"; int comp = str1.compareTo(str2); if(comp < 0) { System.out.println("str1 menor que str2"); } else if(comp > 0) { System.out.println("str1 maior que str2"); } else { System.out.println("str1 e str2 são iguais"); }

Nossa, reparem como as duas mensagens acima foram postadas ao mesmo tempo :idea:

Olá denis

Você pode usar o método compareTo da classe String. Esse método retorna um número inteiro. Por exemplo:

int comparacao = "Cristian".compareTo("denis");

Esse método retorna um numero inteiro. Se ele for menor do que zero, o primeiro argumento é “menor” (alfabeticamente, nesse caso) que o segundo; maior que zero se o primeiro for “maior” que o segundo, e igual a zero se eles forem iguais. Esse método diferencia maiúsculas de minúsuclas. Se não quiser isso, use o compareToIgnoreCase.

Até mais,

Obrigado pela ajuda, foi de grande importancia.

cheguei meio atrasado…
mas o compareTo nao compara so a primeira letra?!?!

como faria pra comparar mais de uma string!?

t+

[quote=imax]cheguei meio atrasado… mas o compareTo nao compara so a primeira letra?!?![/quote]

Ah é? De onde tirou essa conclusão? Do Javadoc que não foi.

Como comparar string com uma letra java
imax:

como faria pra comparar mais de uma string!?

Aprende a ler o Javadoc, vai ser de grande utilidade para você.

[quote=juzepeleteiro][quote=imax]cheguei meio atrasado… mas o compareTo nao compara so a primeira letra?!?![/quote]

Ah é? De onde tirou essa conclusão? Do Javadoc que não foi.

Como comparar string com uma letra java
imax:

como faria pra comparar mais de uma string!?

Aprende a ler o Javadoc, vai ser de grande utilidade para você.
[/quote]

  1. a conclusao eu tirei de outros foruns…
  2. se preocupa nao… eu to lendo… mas nao tenho o tempo necessario pra ler tanto assim…
  3. obrigado pela maneira ironica e amigavel de responder uma duvida…

Como comparar string com uma letra java
imax:

1) a conclusao eu tirei de outros foruns…

Pois é… Cuidado com o que você lê em forum, nem sempre é 100%.

Como comparar string com uma letra java
imax:

2) se preocupa nao… eu to lendo… mas nao tenho o tempo necessario pra ler tanto assim…

Eu nunca li o javadoc inteiro, pelo menos não do inicio ao fim sabe, mas tipo… você tá com dúvida na classe String? Lê o javadoc da classe String, seria mais rapido do que usar o forum.

Como comparar string com uma letra java
imax:

3) obrigado pela maneira ironica e amigavel de responder uma duvida…

Foi ironica sim, e amigável também. Sabe, é melhor ensinar pescar do que dar o peixe.