CodeGym /Cursos /JAVA 25 SELF /Endereçamento de memória e variáveis

Endereçamento de memória e variáveis

JAVA 25 SELF
Nível 2 , Lição 4
Disponível

1. Estrutura da memória

Todo computador tem memória RAM. O que é isso, quais propriedades ela possui e, o mais importante, que vantagem isso nos traz?

Cada programa (inclusive os escritos em Java) é carregado na memória RAM antes de ser executado. Na memória RAM ficam o código do programa (executado pelo processador) e os dados do programa (que o próprio programa coloca na memória).

Afinal, o que é a memória RAM e com o que ela se parece?

Imagine o Excel 😎 Uma planilha do Excel é composta por células, e cada célula tem seu número único (A1, A2, ... B1, B2). Sabendo o número da célula, sempre é possível escrever nela algum valor ou obter o valor que está armazenado ali. A memória do computador é organizada de forma parecida.

memory-excel

O programa e seus dados, durante a execução, são armazenados na memória. Toda a memória do computador é representada em forma de pequenas células — bytes. Cada célula tem seu número único — 0, 1, 2, 3, ... (a numeração começa em zero). Sabendo o número da célula, podemos salvar nela alguns dados. Ou pegá-los dela. Em algumas células fica o código do programa — um conjunto de comandos para o processador; em outras — os dados desse programa. O número da célula também é chamado de endereço da célula.

O processador sabe executar comandos do programa carregado na memória. Quase todos os comandos do processador são algo como: pegar dados de algumas célulasfazer algo com eles → colocar o resultado em outras células.

Ao combinar centenas de comandos simples, obtemos comandos complexos e úteis.

Quando no código do programa é declarada uma variável, é reservado para ela um pedacinho de memória ainda não utilizado. Normalmente são alguns bytes. Ao declarar uma variável, é obrigatório indicar o tipo de informação que o programa armazenará nela: números, texto ou outros dados. Sem conhecer o tipo da informação, não fica claro qual o tamanho do bloco de memória que precisa ser reservado para a variável.

Nos primórdios da computação, os programas trabalhavam apenas com números de células de memória, mas depois, para a conveniência dos programadores, as células passaram a receber nomes. O nome único da variável existe, antes de tudo, para a conveniência dos programadores: durante a execução, o programa se viraria muito bem só com números.

2. Variáveis na memória

Em Java há 4 tipos básicos para armazenar números inteiros. São eles: byte, short, int e long.

Tipo Tamanho, bytes Origem do nome
byte
1
Byte, pois ocupa um byte de memória
short
2
Abreviação de Short Integer
int
4
Abreviação de Integer
long
8
Abreviação de Long Integer

Também há em Java 2 tipos de ponto flutuante — float e double:

Tipo Tamanho, bytes Origem do nome
float
4
Abreviação de Floating-Point Number
double
8
Abreviação de Double Float

Toda vez que a execução do programa chega ao comando de criação de uma variável, é alocada para ela uma pequena área de memória (o tamanho depende do tipo da variável).

Importante!

O endereço de uma variável é considerado o endereço da primeira célula do bloco de memória alocado para ela.

Java-programas não podem acessar a memória diretamente. Todo o trabalho com memória ocorre apenas através da Máquina Virtual Java (JVM).

3. Tipo String na memória

O tipo String pode armazenar grandes volumes de dados, portanto não é apenas um tipo de dado, e sim um objeto completo.

Os próprios dados do tipo String (texto) são colocados em um objeto especial, para o qual é alocada memória, e o endereço desse objeto é colocado na variável, para a qual também é alocada memória.

memory-string

  • A variável a do tipo int ocupa 4 bytes e armazena o valor 1.
  • A variável b do tipo int ocupa 4 bytes e armazena o valor 10.555. O ponto não é a parte fracionária do número, e sim a separação de milhares. A parte fracionária é separada por vírgula.
  • A variável d do tipo double ocupa 8 bytes e armazena o valor 13,001.
  • A variável str do tipo String armazena o valor D12 — o endereço da primeira célula do objeto que contém o texto.

O objeto do tipo String (que contém o texto) é armazenado em um bloco de memória separado. O endereço de sua primeira célula é armazenado na variável str.

4. O que acontece quando fazemos atribuição

Mais uma coisa importante — como a atribuição funciona. Por exemplo:

int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10

Neste exemplo, duas células são criadas na memória: uma para a, outra para b. Quando escrevemos b = a;, o valor é copiado (10), e não a própria “caixa”. As alterações em b não afetam a de forma alguma.

Agora, de forma análoga, mas com strings:

String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"

Aqui, ambas as variáveis s1 e s2 apontam para a mesma string "Hello" até o momento da mudança. Mas quando executamos s2 = s2 + " World";, é criada uma nova string "Hello World" para s2, enquanto s1 continua referenciando a string antiga "Hello".

5. Por que em programação quase tudo é numerado a partir de zero

As pessoas muitas vezes se surpreendem com o fato de que, em programação, quase sempre se conta a partir de zero. O ponto é que há muitas situações em que contar a partir de zero é mais conveniente (embora existam situações em que seja mais conveniente contar a partir de 1).

Vamos pensar em uma analogia. Você está em uma fila longa no mercado. E então o caixa diz que todos os clientes, começando do 20º, devem ir ao segundo caixa. Quais serão os números deles? 20, 21, 22, 23, ... Lógico. E em relação ao 20º? 0, 1, 2, 3, ...

Quando definimos um grupo como “número do primeiro elemento” + “quantidade”, dentro do grupo os números relativos ficam +0, +1, +2, ...

Em programação é a mesma coisa. Se para sua variável foram alocados 100 bytes de memória e você tem X — o endereço do primeiro byte, quais serão os endereços de todos os bytes? X+0, X+1, X+2, ..., X+99. Pronto: obtivemos um grupo de bytes com índices 0, 1, 2, 99.

Quando pensamos em um endereço relativo dentro de algum bloco de dados, sempre obtemos uma numeração que começa em zero. Essa é a primeira e mais comum razão para contar a partir de zero.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION