String Constant Pool: Um exame aprofundado
String literais em Java são agrupados para otimizar o uso de memória e melhorar o desempenho. Isso significa que quando um literal String é encontrado, o compilador verifica o String Constant Pool em busca de um objeto String existente com o mesmo valor. Se encontrada, a referência é direcionada ao objeto existente, evitando a criação de um novo.
No entanto, surge confusão ao usar o operador "novo" para criar um novo objeto String, pois isso aparentemente contradiz a regra de estagiar. Para esclarecer isso, vamos examinar as seguintes afirmações:
Essas instruções indicam que, embora o literal String seja internado e armazenado no pool, o uso de "new" força a JVM a criar um novo objeto String. Isso significa que, apesar da existência de uma String equivalente no pool, o operador "new" a ignora e aloca um novo objeto na memória não-pool.
Para ilustrar isso, considere o seguinte exemplo:
String one = new String("test"); String two = "test"; System.out.println(one.equals(two)); // true System.out.println(one == two); // false
Como esperado, o valor de "um" e "dois" é "teste", mas a comparação "==" retorna falso porque eles se referem a objetos String diferentes. Isso ocorre porque o uso de "new" força a criação de um novo objeto String para "one", mesmo que o "teste" literal de String já exista no pool.
Em resumo, o String Constant Pool otimiza uso de memória internando literais de String. No entanto, o uso de "new" ignora o pool e cria um novo objeto String na memória que não é do pool. Isso resulta em dois objetos String distintos com o mesmo valor, mas referências diferentes.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3