Neste artigo trataremos de um assunto muito comum no desenvolvimento de softwares em Java: o uso dos métodos da classe String. Vamos “destrinchar” os métodos com conceitos e exemplos de como utilizá-los. Esperamos que todas as dúvidas que havia em relação a essa classe possam ser sanadas com este artigo.
Antes de iniciarmos os exemplos e explicações dos métodos desta classe, é importante entender que na verdade a classe String é um “wrapper” de um vetor de “char”. Em outras palavras, o String está para um vetor de char assim como o Integer está para o tipo primitivo int. Não vamos entrar em detalhes do que seja um wrapper, pois não é foco deste artigo.
Por esse motivo é que o código da Listagem 1 tem o mesmo efeito para ambas as situações.
Listagem 1. vetor de char e String
char data[] = {'a', 'b', 'c'};
String str = new String(data);
A principal diferença é que com o “char data[]” não tem-se todo o “poder” que a classe String nos proporciona para manipular esse vetor.
charAt
O nosso primeiro método é bem simples e consiste em retornar apenas um caractere em determinada posição de nossa String. Observe a Listagem 2.
Listagem 2. Uso do charAt
String valor = "DEVMEDIA - Java";
System.out.println(valor.charAt(0));
Saída: D
codePointAt
Retorna o valor em UNICODE do caractere especificado no index do parâmetro. Confira a Listagem 3.
Listagem 3. Uso do codePointAt
String valor = "DEVMEDIA - Java";
System.out.println(valor.codePointAt(0));
Saída: 68
Note que a codificação da letra 'D' correspondente a posição 0 na nossa String é igual a 68, considerando a codificação UNICODE.
compareTo e compareToIgnoreCase
Ambos fazem comparação de duas Strings, sendo que o primeiro (compareTo) considera letras maiúsculas e minúsculas na comparação e o segundo (compareToIgnoreCase) ignora qualquer diferença de minúsculas ou maiúsculas. Ambos também retornam a quantidade de diferenças, sendo que nos importa saber, no momento, que quando o retorno for igual a zero significa que não há diferenças entre a String. Observe a Listagem 4.
Listagem 4. Uso do compareTo e compareToIgnoreCase
String valor = "DEVMEDIA - Java";
System.out.println(valor.compareTo("DEVMEDIA - Java") == 0 ? true : false);
System.out.println(valor.compareTo("DEVMEDIA - JAVA") == 0 ? true : false);
System.out.println(valor.compareToIgnoreCase
("DEVMEDIA - JAVA") == 0 ? true : false);
Saída:true
false
true
endsWith e startsWith
O método endsWith verifica se a String termina com o valor especificado, por outro lado o startsWith verifica se a String começa com o valor especificado. Sendo que o método startsWith tem duas variações: uma com o parâmetro “int toffset” e outra sem, onde o método que contém o parâmetro “int toffset” serve para dizer de onde deve começar a verificação do inicio da String. Veja o exemplo da Listagem 5.
Listagem 5. Uso do endsWith, startsWith e startsWith com tooffset
String valor = "DEVMEDIA - Java";
System.out.println(valor.endsWith("Java"));
System.out.println(valor.startsWith("DEV"));
System.out.println(valor.startsWith("ME", 3));
Saída: true
true
true
toCharArray
Converte uma String em um Array de char, ou seja, uma String de 10 posições irá ser convertida em um vetor char[] de 10 posições, conforme a Listagem 6.
Listagem 6. Uso do toCharArray
String valor = "DEVMEDIA - Java";
for(char c : valor.toCharArray()){
System.out.println("Char: "+c);
}
Saída:
Char: D
Char: E
Char: V
Char: M
Char: E
Char: D
Char: I
Char: A
Char:
Char: -
Char:
Char: J
Char: a
Char: v
Char: a
getBytes
Converte a String em um vetor de byte[]. Este método é muito útil principalmente quando precisamos salvar caracteres no banco desconsiderando a codificação atual. No PostgreSQL, por exemplo, você pode utilizar o tipo “bytea” que é análogo ao “byte” em Java. Assim como você pode converter para byte, você também pode voltar para String ou char. Observe a Listagem 7.
Listagem 7. Uso do getBytes
String valor = "DEVMEDIA - Java";
for(byte b : valor.getBytes()){
System.out.println("byte: "+b);
}
Saída:
byte: 68
byte: 69
byte: 86
byte: 77
byte: 69
byte: 68
byte: 73
byte: 65
byte: 32
byte: 45
byte: 32
byte: 74
byte: 97
byte: 118
byte: 97
isEmpty
Um método muito utilizado e comum que verifica se uma String está ou não vazia, mas tenha atenção neste método, pois a verificação baseia-se se sua String possui tamanho = 0, ou seja, o String.length() = 0. Isso significa que caso você tente utilizar o isEmpty() em uma String que possui valor NULL você receberá um NullPointerException. Analise o exemplo da Listagem 8.
Listagem 8. Usando isEmpty de forma errada
String valor = null;
System.out.println(valor.isEmpty());
Saída: Exception in thread "main" java.lang.NullPointerException
at StringManager.main(StringManager.java:9)
split
O método split cria um array de Strings com base no “regex” passado via parâmetro, ou seja, ele divide a String em várias outras Strings com base no seu regex, o que é muito útil para separar tags em uma String completa, ex: “software, engenharia, computação”. Você pode transformar essa única String em um array com três Strings.
Este método também possui uma variação, que é o parâmetro “int limit”, onde você identifica quantas vezes o regex será aplicado em toda String. Vamos ver exemplos presentes na Listagem 9.
Listagem 9. Usando split e split com limit
/*
* Uso do split sem o LIMIT
* */
String valor = "DEVMEDIA - Java";
String[] valorComSplit = valor.split("-");
for(String s : valorComSplit){
System.out.println(s);
}
Saída:DEVMEDIA
Java
/*
* Uso do split com o LIMIT
* */
String valor = "DEVMEDIA - Java - Engenharia - Software";
String[] valorComSplit = valor.split("-", 2);
for(String s : valorComSplit){
System.out.println(s);
}
Saída:
DEVMEDIA
Java - Engenharia - Software
Por que no segundo bloco de código o split não divide “Java – Engenharia – Software” ? Simples, pois explicitamente dizemos quantas vezes o regex será aplicado, o que influência diretamente no tamanho final do nosso vetor, que será igual a dois.
substring e subSequence
Ambos os métodos retornam uma parte específica de uma determinada String, sendo que o método substring retorna uma nova String e o método subSequence retorna um CharSequence. É importante ressaltar que o CharSequence é uma interface e a String é a implementação dessa interface. Observe o exemplo da Listagem 10.
Listagem 10. Usando substring e subSequence
String valor = "DEVMEDIA - Java";
System.out.println(valor.subSequence(0, 5));
System.out.println(valor.substring(0, 5));
Saída:
DEVME
DEVME
toLowerCase, toUpperCase e trim
O método toLowerCase converte toda a String para caixa baixa e o toUpperCase faz o inverso, convertendo toda a String para caixa alta. O método trim remove espaços em branco no inicial e no final da String, conforme exemplo da Listagem 11.
Listagem 11. Uso do toLowerCase, toUpperCase e trim
String valor = "DEVMEDIA - Java";
System.out.println(valor.toLowerCase());
System.out.println(valor.toUpperCase());
System.out.println(valor.trim());
Saída:
devmedia - java
DEVMEDIA - JAVA
DEVMEDIA - Java
valueOf
Este método converte diversos tipos (booleano, inteiro, char, double, float, long, Object e etc) para String, conforme exemplo da Listagem 12.
Listagem 12. Uso do valueOf
//boolean
boolean myBoolean = true;
System.out.println(String.valueOf(myBoolean));
//float
float myFloat = -10;
System.out.println(String.valueOf(myFloat));
//int
int myInt = 9;
System.out.println(String.valueOf(myInt));
///double
double myDouble = 10.30;
System.out.println(String.valueOf(myDouble));
Saída:
true
-10.0
9
10.3
format
Como o próprio já sugere, o String.format realiza a formatação de uma String de acordo com as especificações passadas. Vamos ver como funciona no exemplo da Listagem 13.
Listagem 13. Uso do format
String result = String.format("Hoje nós processamos %,d transações", 100000);
System.out.println(result);
result = String.format("10 / 3 = %.2f", 10.0 / 3.0);
System.out.println(result);
Em resumo, temos a String em si e os objetos que serão usados na formatação.
O objetivo deste artigo foi demonstrar o uso com detalhes da classe String e a maioria dos seus métodos, definindo conceitos práticos e diretos juntamente com exemplos do funcionamento de cada um deles. Estudar esses tipos de Wrapper, como é o caso do Boolean, Integer entre outros, é importante para saber como manipular de forma correta os dados da sua aplicação, aumentando a produtividade e evitando trabalho desnecessário.
Um exemplo comum é o uso do subString, que lhe auxilia no retorno de uma determinada parcela da String, enquanto que caso você não conhecesse tal recurso, seria obrigado a criar um laço de repetição para retornar os caracteres dentro do intervalo desejado, tarefas simples e triviais acabam tornando-se um problema quando não temos o conhecimento necessário para realizá-las.