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.

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élulas → fazer 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, pois ocupa um byte de memória |
|
|
Abreviação de Short Integer |
|
|
Abreviação de Integer |
|
|
Abreviação de Long Integer |
Também há em Java 2 tipos de ponto flutuante — float e double:
| Tipo | Tamanho, bytes | Origem do nome |
|---|---|---|
|
|
Abreviação de Floating-Point Number |
|
|
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).
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.

- 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.
GO TO FULL VERSION