Introdução: Magia que não é aleatória
\n\nSe você já passou horas no Stack Overflow procurando a resposta para um bug estranho, provavelmente viu a pergunta que reuniu milhares de visualizações e discussões acaloradas: "Why does this code using random strings print 'hello world'?". Parece um enigma, não é? Como strings geradas aleatoriamente podem formar uma saudação significativa?
\n\nNeste artigo, não vamos apenas desvendar esse fenômeno de SEO (sim, é um ótimo caso para promoção em mecanismos de busca de conteúdo educacional), mas transformá-lo em uma aula completa sobre Java. Você aprenderá como funcionam os pools de strings, por que hashCode() às vezes surpreende e quais melhores práticas adotar em 2025 para que seu código seja previsível e eficiente.
Pronto? Vamos lá!
\n\n1. Aquele código: o que está acontecendo?
\n\nVamos relembrar o exemplo clássico que explodiu no Stack Overflow. Imagine que você tem um método que gera strings aleatórias e verifica se são iguais:
\n\npublic class RandomStringTest {\n public static void main(String[] args) {\n String[] randomStrings = new String[1000];\n for (int i = 0; i < 1000; i++) {\n randomStrings[i] = generateRandomString();\n }\n \n for (String s : randomStrings) {\n if (s.equals("hello world")) {\n System.out.println("Found: " + s);\n }\n }\n }\n \n public static String generateRandomString() {\n // Alguma lógica estranha\n return new StringBuilder()\n .append((char) (Math.random() * 256))\n .append((char) (Math.random() * 256))\n // ... muitos caracteres\n .toString();\n }\n}\n\n\nÀ primeira vista, a chance de obter "hello world" aleatoriamente é (1/256)^11 — praticamente zero. Mas o código imprime "hello world"! Como? Aleatoriedade não tem nada a ver com isso. O segredo está no pool de strings (String pool) e nas peculiaridades do hashing em Java.
\n\n2. A revelação: String Pool e hashCode
\n\nEm Java, strings são objetos imutáveis. Quando você cria uma string usando um literal ("hello world"), ela vai para o String pool — uma área especial de memória. Se outra string referencia o mesmo valor, a JVM não cria um novo objeto, mas retorna uma referência ao existente.
Mas no nosso exemplo, as strings são geradas aleatoriamente. Como elas ainda assim são iguais? Resposta: hashCode() sobrescrito. Em algumas versões do Java (especialmente anteriores à 8), o algoritmo de hashing de strings era previsível e podia causar colisões se as strings tivessem o mesmo comprimento e composição de caracteres. No entanto, a verdadeira mágica acontece quando o String pool usa internamento.
\n\nQuando você chama s.equals("hello world"), a JVM pode otimizar a comparação se ambas as strings estiverem no pool. Mas no nosso caso, as strings são diferentes... Ou não? Na verdade, se você olhar a implementação de generateRandomString() na pergunta original, havia um truque: o método retornava uma string que sempre era "hello world" devido a um erro na lógica de geração.
Aqui está um exemplo dessa "aleatoriedade":
\n\npublic static String generateRandomString() {\n Random random = new Random(42); // Seed fixo\n byte[] bytes = new byte[11];\n random.nextBytes(bytes);\n return new String(bytes);\n}\n\n\nSe o seed é fixo, a sequência "aleatória" é sempre a mesma. E se o seed for escolhido para gerar "hello world"? Essa é a resposta para o enigma! O código não é aleatório — é determinístico.
\n\n