Heap e pilha são conceitos muito importantes na estrutura de dados Java. Este artigo analisa a diferença entre os dois com mais detalhes. Para sua referência. Os detalhes são os seguintes:
O heap de Java é uma área de dados de tempo de execução a partir da qual os objetos de classe alocam espaço. Esses objetos são criados por meio de instruções como new, newaray, anewarray e multianewarray e não exigem que o código do programa seja explicitamente liberado. Responsável, a vantagem do heap é que ele pode alocar dinamicamente o tamanho da memória, e o tempo de vida não precisa ser informado ao compilador com antecedência, porque ele aloca memória dinamicamente em tempo de execução, e o coletor de lixo do Java coletará automaticamente aqueles que não são mais usados dados Mas a desvantagem é que devido à necessidade de alocar memória dinamicamente em tempo de execução, a velocidade de acesso é lenta.
A vantagem da pilha é que a velocidade de acesso é mais rápida que a do heap, perdendo apenas para o registrador, e os dados da pilha podem ser compartilhados. Mas a desvantagem é que o tamanho e a vida útil dos dados armazenados na pilha devem ser determinados e há falta de flexibilidade. A pilha armazena principalmente alguns tipos básicos de variáveis (int, short, long, byte, float, double, boolean, char) e manipuladores de objetos.
Uma característica especial muito importante da pilha é que os dados armazenados na pilha podem ser compartilhados. Suponha que também definimos:
intuma = 3;
int b = 3;
O compilador primeiro processa int a = 3; primeiro ele cria uma referência para a variável a na pilha e depois verifica se há um valor 3 na pilha. Se não for encontrado, ele armazena 3 e então aponta a para. 3. Em seguida, processe int b = 3; após criar a variável de referência de b, como já existe um valor 3 na pilha, b será apontado diretamente para 3. Desta forma, existe uma situação em que a e b apontam para 3 ao mesmo tempo.
Neste momento, se a=4 for definido novamente, o compilador irá pesquisar se existe um valor 4 na pilha. Caso contrário, ele armazenará 4 e apontará para 4; apontará diretamente para este endereço. Portanto, alterações no valor de a não afetarão o valor de b.
Deve-se notar que este tipo de compartilhamento de dados é diferente do compartilhamento de referências de dois objetos apontando para um objeto ao mesmo tempo, pois neste caso a modificação de a não afetará b, ela é completada pelo compilador, que é benéfico para economizar espaço. Se uma variável de referência de objeto modificar o estado interno do objeto, ela afetará outra variável de referência de objeto.
String é um tipo especial de dados de wrapper. Pode ser usado:
String str = new String("abc");String str = "abc";
Existem duas maneiras de criá-lo. A primeira é usar new() para criar um novo objeto, que será armazenado no heap. Um novo objeto é criado cada vez que é chamado.
O segundo método é primeiro criar uma variável de referência de objeto str da classe String na pilha e, em seguida, verificar se "abc" está armazenado na pilha. Caso contrário, armazene "abc" na pilha e faça str apontar para "abc. ". , se já existir "abc", aponte str diretamente para "abc".
Ao comparar se os valores em uma classe são iguais, use o método equals(); ao testar se as referências de duas classes wrapper apontam para o mesmo objeto, use ==.
String str1 = "abc"; String str2 = "abc";
Pode-se ver que str1 e str2 apontam para o mesmo objeto.
String str1 =nova String ("abc"); String str2 =nova String ("abc");
Usar new é gerar objetos diferentes. Gere um de cada vez.
Portanto, se você usar o primeiro método para criar várias strings "abc", na verdade haverá apenas um objeto na memória. Essa forma de escrita é benéfica para economizar espaço de memória. programa até certo ponto, porque a JVM determinará automaticamente se é necessário criar um novo objeto com base na situação real dos dados na pilha. Para o código de String str = new String("abc");, novos objetos são sempre criados no heap, independentemente de seus valores de string serem iguais ou se for necessário criar novos objetos, aumentando assim a carga sobre o programa.
Por outro lado, observe: Quando definimos uma classe usando um formato como String str = "abc";, sempre assumimos que o objeto str da classe String é criado. Preocupe-se com armadilhas! O objeto pode não ter sido criado! Em vez disso, pode apenas apontar para um objeto criado anteriormente. Somente através do método new() podemos garantir que um novo objeto seja criado a cada vez.
Devido à natureza imutável da classe String, quando uma variável String precisa alterar frequentemente seu valor, você deve considerar o uso da classe StringBuffer para melhorar a eficiência do programa.
Espero que o que este artigo descreve seja útil para o aprendizado de programação Java para todos.