1. StringTokenizeraula
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.
StringTokenizeraula
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 StringTokenizerobjeto com este comando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Onde stringestá 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 StringTokenizerconstrutor é considerado um separador.
2. String.format()método e StringFormatterclasse
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 %de %s) nos locais onde você precisa inserir dados.
O format()método substitui esses %se %dos 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$dobterá o terceiro argumento, %2$dobterá o segundo argumento e %dobterá o primeiro argumento. Os especificadores de formato %se %dreferem-se a argumentos independentemente de especificadores como %3$dou%2$s
3. Conjunto de Strings
Cada string especificada no código como uma string literal é armazenada em uma área da memória chamada StringPoolenquanto o programa está em execução. StringPool é uma tabela especial para armazenar strings (na prática, uma tabela hash). 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 é exatamente assim que funciona: para cada string literal, a máquina Java usa uma string do StringPool. Se essa string ainda não estiver lá, ela é adicionada; se já estiver, é usada uma referência a ela. (Quando exatamente isso acontece — ao carregar a classe ou no primeiro uso do literal — depende da implementação da JVM.)
Da mesma forma, se você atribuir o mesmo literal a várias Stringvariáveis em seu código, essas variáveis conterão a mesma referência. Um literal será adicionado StringPoolapenas 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 ae birã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 Stringda variável intern().
O intern()método adicionará a string ao StringPoolse ainda não estiver lá e retornará uma referência à string no arquivo StringPool.
Se duas strings idênticas forem adicionadas ao StringPoolusando 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