Aproveitar a Imutabilidade para Cache de Hashcode em Coleções
A imutabilidade das Strings as torna ideais para uso como chaves em coleções baseadas em hash, como HashMap e HashSet. Como o valor de uma String nunca muda, seu hashCode() pode ser computado uma vez e armazenado em cache. Chamadas subsequentes a hashCode() retornarão o valor em cache, levando a melhorias significativas de desempenho, especialmente quando Strings são frequentemente usadas como chaves.
Se as Strings fossem mutáveis, seu código hash poderia mudar após serem inseridas em um HashMap, tornando impossível recuperar o objeto usando o código hash original.
Vamos adicionar código ao ImmutableStringDemo.java para demonstrar o uso de String em um HashMap.
Adicione o seguinte código ao método main do seu arquivo ImmutableStringDemo.java, após a demonstração de segurança de thread:
// ~/project/ImmutableStringDemo.java
import java.util.HashMap; // Certifique-se de que esta importação esteja no topo do seu arquivo
public class ImmutableStringDemo {
private static final String SECURE_PASSWORD = "MySecurePassword123";
static class ThreadSafeTask implements Runnable {
private final String password;
public ThreadSafeTask(String password) {
this.password = password;
}
@Override
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + " acessando senha: " + password);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public static void main(String[] args) {
// ... (o código anterior para name, str1, str2, str3 e segurança de thread permanece aqui) ...
String name = "LabexUser";
System.out.println("Nome inicial: " + name);
String str1 = "Hello";
String str2 = "Hello";
System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
System.out.println("str1 == str2: " + (str1 == str2));
String str3 = new String("Hello");
System.out.println("str3: " + str3);
System.out.println("str1 == str3: " + (str1 == str3));
System.out.println("\n--- Demonstrando Segurança e Segurança de Thread ---");
System.out.println("Senha Segura: " + SECURE_PASSWORD);
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(new ThreadSafeTask(SECURE_PASSWORD), "Thread-" + (i + 1));
thread.start();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("\n--- Demonstrando Cache de Hashcode ---");
HashMap<String, Integer> studentScores = new HashMap<>();
String studentName1 = "Alice";
String studentName2 = "Bob";
String studentName3 = "Alice"; // Isso se referirá à mesma "Alice" no String pool
studentScores.put(studentName1, 95);
studentScores.put(studentName2, 88);
studentScores.put(studentName3, 92); // Isso atualizará o valor para "Alice"
System.out.println("Pontuações dos Alunos: " + studentScores);
System.out.println("Pontuação da Alice: " + studentScores.get("Alice"));
System.out.println("Pontuação do Bob: " + studentScores.get("Bob"));
// Demonstra que mesmo que tentemos "alterar" uma String, uma nova é criada
String originalString = "Java";
System.out.println("String Original: " + originalString + ", HashCode: " + originalString.hashCode());
String modifiedString = originalString.concat(" Programming"); // Cria uma nova String
System.out.println("String Modificada: " + modifiedString + ", HashCode: " + modifiedString.hashCode());
System.out.println("String Original (após concat): " + originalString + ", HashCode: " + originalString.hashCode());
}
}
Salve o arquivo. Em seguida, compile e execute o programa novamente:
javac ImmutableStringDemo.java
java ImmutableStringDemo
Você deverá ver uma saída semelhante a esta, incluindo as demonstrações de HashMap e hashcode:
Nome inicial: LabexUser
str1: Hello
str2: Hello
str1 == str2: true
str3: Hello
str1 == str3: false
--- Demonstrando Segurança e Segurança de Thread ---
Senha Segura: MySecurePassword123
Thread Thread-1 acessando senha: MySecurePassword123
Thread Thread-2 acessando senha: MySecurePassword123
Thread Thread-3 acessando senha: MySecurePassword123
--- Demonstrando Cache de Hashcode ---
Pontuações dos Alunos: {Bob=88, Alice=92}
Pontuação da Alice: 92
Pontuação do Bob: 88
String Original: Java, HashCode: 2301506
String Modificada: Java Programming, HashCode: -1479700901
String Original (após concat): Java, HashCode: 2301506
Observe como o hash code de originalString permanece o mesmo mesmo após a chamada de concat, porque concat retorna um novo objeto String, deixando o original intocado.