Na programação orientada a objetos, o string ou objetos imutáveis que não pode ser modificado depois de criado. Mas só podemos alterar a referência ao objeto. Nós nos restringimos a alterar o próprio objeto. O String é imutável em Java por causa da segurança, sincronização e simultaneidade, armazenamento em cache e carregamento de classe. A razão de tornar a string final é destruir a imutabilidade e não permitir que outros a estendam.
Os objetos String são armazenados em cache no pool String e isso faz com que o String imutável . Os literais String armazenados em cache são acessados por vários clientes. Portanto, sempre existe um risco, onde a ação executada por um cliente afeta todos os outros clientes. Por exemplo, se um cliente executar uma ação e alterar o valor da string de Pressão para PRESSÃO, todos os clientes restantes também lerão esse valor. Por motivos de desempenho, o armazenamento em cache de objetos String era importante, portanto, para remover esse risco, temos que tornar a String Imutável.
Estas são mais algumas razões para tornar String imutável:
- O pool String não pode ser possível se String não for imutável em Java. Muito espaço de heap é economizado por JRE . A mesma variável de string pode ser referenciada por mais de uma variável de string no pool. A internação de String também não pode ser possível se a String não for imutável.
- Se não tornarmos a String imutável, ela representará uma séria ameaça à segurança do aplicativo. Por exemplo, nomes de usuário e senhas de banco de dados são passados como strings para receber conexões de banco de dados. O programação de soquete descrições de host e porta também são passadas como strings. A String é imutável, portanto seu valor não pode ser alterado. Se a String não permanecer imutável, qualquer hacker poderá causar um problema de segurança na aplicação alterando o valor de referência.
- A String é segura para multithreading devido à sua imutável. Threads diferentes podem acessar uma única 'instância de String'. Ele remove a sincronização para segurança de thread porque tornamos as strings implicitamente seguras para thread.
- A imutabilidade dá a segurança de carregar a classe correta pelo Classloader. Por exemplo, suponha que temos uma instância em que tentamos carregar a classe java.sql.Connection, mas as alterações no valor referenciado para a classe myhacked.Connection causam coisas indesejadas em nosso banco de dados.
Vamos entender o conceito de imutável através de um exemplo.
ImutávelString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Saída:
substituir tudo na string java
Descrição: Podemos entender o exemplo acima com a ajuda do seguinte diagrama:
No conjunto de constantes de string, o Olá permanece inalterado e um novo objeto string é criado com Olá Mundo . Isso mostra que as strings são imutáveis. A variável de referência aponta para o Olá não para o Olá Mundo.
Se quisermos que se refira ao Olá Mundo , temos que atribuí-lo explicitamente a essa variável. Por exemplo:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Saída: