1. StringTokenizer
aula
E agora mais alguns cenários comuns envolvendo o trabalho com strings. Como dividir uma string em várias partes? Existem várias maneiras de fazer isso.
split()
método
A primeira maneira de dividir uma string em várias partes é usar o split()
método. Uma expressão regular que define uma string de delimitação especial deve ser passada como um argumento. Você aprenderá o que é uma expressão regular na missão Java Multithreading .
Exemplo:
Código | Resultado |
---|---|
|
O resultado será um array de três strings:
|
Simples, mas às vezes essa abordagem é excessiva. Se houver muitos delimitadores (por exemplo, espaços, caracteres de nova linha, tabulações, pontos), será necessário construir uma expressão regular bastante complexa. É difícil de ler e, portanto, difícil de modificar.
StringTokenizer
aula
Java tem uma classe especial cujo trabalho é dividir uma string em substrings.
Esta classe não usa expressões regulares: em vez disso, você simplesmente passa uma string que consiste em delimitadores. A vantagem dessa abordagem é que ela não quebra a corda inteira em pedaços de uma só vez, mas se move do começo ao fim, um passo de cada vez.
A classe tem um construtor e dois métodos importantes. Passamos ao construtor uma string que dividimos em partes e uma string composta por um conjunto de caracteres delimitadores.
Métodos | Descrição |
---|---|
|
Retorna a próxima substring |
|
Verifica se há mais substrings. |
Essa classe lembra de alguma forma a classe Scanner, que também possui métodos nextLine()
e hasNextLine()
.
Você pode criar um StringTokenizer
objeto com este comando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Onde string
está a string a ser dividida em partes. E delimiters
é uma string e cada caractere nela é tratado como um delimitador. Exemplo:
Código | Saída do console |
---|---|
|
|
Observe que cada caractere na string passado como a segunda string para o StringTokenizer
construtor é considerado um separador.
2. String.format()
método e StringFormatter
classe
Outro método interessante da classe String é format()
.
Digamos que você tenha várias variáveis armazenando dados. Como você os exibe na tela em uma linha? Por exemplo, temos alguns dados (coluna da esquerda) e saída desejada (coluna da direita):
Código | Saída do console |
---|---|
|
|
Seu código provavelmente ficará mais ou menos assim:
código do programa |
---|
|
Esse código não é muito legível. E se os nomes das variáveis fossem mais longos, o código se tornaria ainda mais difícil:
código do programa |
---|
|
Não é muito legível, não é?
Mas esta é uma situação comum em programas do mundo real, então quero falar sobre uma maneira de escrever este código de forma mais simples e concisa.
String.format
A classe String tem um format()
método estático: permite especificar um padrão para montar uma string com dados. A aparência geral do comando é a seguinte:
String name = String.format(pattern, parameters);
Exemplo:
Código | Resultado |
---|---|
|
|
|
|
|
|
O format()
primeiro parâmetro do método é uma string de formato que contém todo o texto desejado junto com caracteres especiais chamados especificadores de formato (como %d
e %s
) nos locais onde você precisa inserir dados.
O format()
método substitui esses %s
e %d
os especificadores de formato pelos parâmetros que seguem a string de formato na lista de parâmetros. Se quisermos inserir uma string, escrevemos %s
. Se quisermos inserir um número, o especificador de formato é %d
. Exemplo:
Código | Resultado |
---|---|
|
s é igual a"a=1, b=4, c=3" |
Aqui está uma pequena lista de especificadores de formato que podem ser usados dentro da string de formato:
especificador | Significado |
---|---|
|
String |
|
inteiro: byte , short , int ,long |
|
número real: float ,double |
|
boolean |
|
char |
|
Date |
|
% personagem |
Esses especificadores indicam o tipo de dados, mas também existem especificadores que indicam a ordem dos dados. Para obter um argumento pelo seu número (a numeração começa em um), você precisa escrever " " em vez de " ". Exemplo:%1$d
%d
Código | Resultado |
---|---|
|
s é igual a"a=13, b=12, c=11" |
%3$d
obterá o terceiro argumento, %2$d
obterá o segundo argumento e %d
obterá o primeiro argumento. Os especificadores de formato %s
e %d
referem-se a argumentos independentemente de especificadores como %3$d
ou%2$s
3. Conjunto de Strings
Cada string especificada no código como uma string literal é armazenada em uma área da memória chamada StringPool
enquanto o programa está em execução. StringPool
é um array especial para armazenar strings. Sua finalidade é otimizar o armazenamento de strings:
Primeiro, as strings especificadas no código devem ser armazenadas em algum lugar, certo? O código consiste em comandos, mas os dados (especialmente strings grandes) devem ser armazenados na memória separadamente do código. Somente referências a objetos de string aparecem no código.
Em segundo lugar, todas as strings literais idênticas devem ser armazenadas na memória apenas uma vez. E é assim que funciona. Quando seu código de classe é carregado pela máquina Java, todas as strings literais são adicionadas ao StringPool
caso ainda não estejam lá. Se eles já estiverem lá, simplesmente usamos uma referência de string do arquivo StringPool
.
Da mesma forma, se você atribuir o mesmo literal a várias String
variáveis em seu código, essas variáveis conterão a mesma referência. Um literal será adicionado StringPool
apenas uma vez. Em todos os outros casos, o código obterá uma referência à string já carregada no arquivo StringPool
.
Aqui está mais ou menos como funciona:
Código | Trabalhando com o StringPool |
---|---|
|
|
É por isso que as variáveis a
e b
irão armazenar as mesmas referências.
intern()
método
E a melhor parte é que você pode adicionar programaticamente qualquer string ao arquivo StringPool
. Para fazer isso, basta chamar o método String
da variável intern()
.
O intern()
método adicionará a string ao StringPool
se ainda não estiver lá e retornará uma referência à string no arquivo StringPool
.
Se duas strings idênticas forem adicionadas ao StringPool
usando o intern()
método, o método retornará a mesma referência. Isso pode ser usado para comparar strings por referência. Exemplo:
Código | Observação |
---|---|
|
|
|
|
É improvável que você use esse método com frequência, mas as pessoas adoram perguntar sobre isso em entrevistas . Então é melhor saber do que não saber.
GO TO FULL VERSION