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.