Zeros à esquerda em Java: do iniciante ao profissional com medição de desempenho
\n\nTodo desenvolvedor Java, mais cedo ou mais tarde, enfrenta a tarefa: "Como adicionar zeros à esquerda a um número?". Parece uma operação trivial — pegar o número 42 e transformá-lo em "000042". Mas assim que você começa a pesquisar, encontra dezenas de maneiras: String.format, DecimalFormat, StringBuilder, loops manuais e até String.repeat (Java 11+).
A pergunta "How can I pad an integer with zeros on the left?" no Stack Overflow acumulou milhares de visualizações. E não é por acaso. Por trás de uma ação simples, esconde-se uma série de dilemas: qual método é mais rápido? Qual é mais legível? Qual não prejudicará o desempenho em uma aplicação de alta carga?
\n\nNeste artigo, não vamos apenas mostrar código. Realizaremos nossa própria mini-pesquisa, mediremos a velocidade de cada abordagem e daremos recomendações claras. Você aprenderá quando pode sacrificar microssegundos pela elegância e quando é melhor escrever um código "sujo", mas extremamente rápido.
\n\nPor que isso é importante? Contexto de desempenho
\n\nSuponha que você esteja gerando milhões de identificadores de string em um processo ETL, criando números de pedidos ou serializando dados para logs. Cada nanossegundo extra no padding zeros é multiplicado pelo número de operações. A diferença entre o "bonito" String.format e o manual StringBuilder pode chegar a centenas de por cento.
Mas não se apresse em otimizar tudo. Como disse Donald Knuth: "A otimização prematura é a raiz de todos os males". Primeiro, vamos entender as ferramentas e depois decidir qual escolher.
\n\nMétodo 1: String.format() — o rei da legibilidade
\n\nA opção mais popular e intuitiva. O método String.format() usa o especificador %0Nd, onde N é o comprimento total da string resultante.
int number = 42;\nString padded = String.format("%06d", number); // "000042"\nSystem.out.println(padded);\n\nAs vantagens são óbvias: o código é lido como texto comum, sem necessidade de pensar em casos extremos. A desvantagem é o desempenho. String.format cria internamente um Formatter e analisa a string de formato a cada chamada. Para operações únicas é ideal, para um loop de 10 milhões de iterações é questionável.
Método 2: DecimalFormat — herança dos formatos monetários
\n\nA classe DecimalFormat do pacote java.text foi originalmente criada para formatar moedas e porcentagens, mas lida muito bem com leading zeros.
import java.text.DecimalFormat;\n\nDecimalFormat df = new DecimalFormat("000000");\nString padded = df.format(42); // "000042"\n\nO principal detalhe: DecimalFormat não é thread-safe. Se você usá-lo em um ambiente multithread, terá que sincronizar ou criar uma nova instância a cada chamada (o que prejudica o desempenho).
Método 3: StringBuilder + cálculo manual — hardcore
\n\nPara quem não tem medo de escrever algumas linhas extras em prol da velocidade. Criamos um array de caracteres com o comprimento desejado, preenchemos com zeros e depois copiamos os dígitos do número a partir do final.
\n\npublic static String padLeftZeros(int number, int totalLength) {\n char[] result = new char[totalLength];\n for (int i = 0; i < totalLength; i++) {\n result[i] = '0';\n }\n int index = totalLength - 1;\n while (number > 0 && index >= 0) {\n result[index--] = (char) ('0' + (number % 10));\n number /= 10;\n }\n return new String(result);\n}\n\n// Uso:\nString padded = padLeftZeros(42, 6); // "000042"\n\nEste método é muito mais rápido que String.format, mas requer cuidado: é necessário tratar números negativos (não os consideramos por simplicidade) e o caso em que o número é maior que o comprimento especificado.