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.