1. Estructura de la memoria
Cada ordenador tiene memoria RAM. ¿Qué es exactamente, qué propiedades tiene y, lo más importante, qué beneficio nos aporta?
Cada programa (incluidos los escritos en Java) se carga en la memoria RAM antes de ejecutarse. En la memoria RAM se encuentra el código del programa (que ejecuta el procesador) y los datos del programa (que el propio programa coloca en memoria).
Entonces, ¿qué es la memoria RAM y a qué se parece?
Imagina Excel 😎 Una hoja de Excel consta de celdas y cada celda tiene su número único (A1, A2, ... B1, B2). Al conocer el número de la celda, siempre puedes escribir en ella algún valor o bien obtener el valor almacenado. La memoria del ordenador está organizada de forma similar.

El programa y sus datos, mientras se ejecuta, se almacenan en la memoria. Toda la memoria del ordenador se representa como pequeñas celdas — bytes. Cada celda tiene su número único: 0, 1, 2, 3, ... (la numeración empieza en cero). Sabiendo el número de la celda, podemos guardar en ella algunos datos o leerlos. En unas celdas se almacena el código del programa — un conjunto de instrucciones para el procesador — y en otras, los datos de ese programa. Al número de la celda también se le llama dirección de la celda.
El procesador sabe ejecutar instrucciones del programa cargado en memoria. Casi todas las instrucciones del procesador — suelen ser algo como: tomar datos de algunas celdas → hacer algo con ellos → colocar el resultado en otras celdas.
Al combinar cientos de instrucciones simples, obtenemos instrucciones complejas y útiles.
Cuando en el código del programa se declara una variable, se le asigna un pedacito de memoria aún no utilizada. Suele ser unos pocos bytes. Al declarar una variable, es obligatorio indicar el tipo de información que el programa almacenará en ella: números, texto u otros datos. Sin conocer el tipo de información, no está claro de qué tamaño debe ser el bloque de memoria que hay que asignar para la variable.
En los albores de la informática, los programas trabajaban directamente con los números de las celdas de memoria, pero luego, para la comodidad de los programadores, se empezó a dar nombres a las celdas. El nombre único de la variable es, ante todo, por comodidad de los programadores: el programa, en tiempo de ejecución, funcionaría perfectamente solo con números.
2. Variables en memoria
En Java hay 4 tipos de datos principales para almacenar números enteros: byte, short, int y long.
| Tipo | Tamaño, bytes | Origen del nombre |
|---|---|---|
|
|
Byte, porque ocupa un byte de memoria |
|
|
Abreviatura de Short Integer |
|
|
Abreviatura de Integer |
|
|
Abreviatura de Long Integer |
Además, en Java hay 2 tipos de punto flotante — float y double:
| Tipo | Tamaño, bytes | Origen del nombre |
|---|---|---|
|
|
Abreviatura de Floating Point Number |
|
|
Abreviatura de Double Float |
Cada vez que la ejecución del programa llega a la instrucción de creación de una variable, se le asigna una pequeña área de memoria (el tamaño depende del tipo de variable).
Se considera como dirección de la variable la dirección de la primera celda del bloque de memoria asignado para ella.
A los programas de Java no se les permite acceder directamente a la memoria. Todo el trabajo con la memoria se realiza únicamente a través de la máquina virtual de Java.
3. El tipo String en memoria
El tipo String puede almacenar grandes volúmenes de datos; por lo tanto, no es solo un tipo de datos, sino un objeto en toda regla.
Los propios datos de tipo String (texto) se colocan en un objeto especial, para el cual se asigna memoria, y la dirección de ese objeto se guarda en la variable, para la cual también se asigna memoria.

- La variable a de tipo int ocupa 4 bytes y almacena el valor 1.
- La variable b de tipo int ocupa 4 bytes y almacena el valor 10,555. La coma no es la parte fraccionaria del número, sino un separador de miles. La parte fraccionaria se separa con un punto.
- La variable d de tipo double ocupa 8 bytes y almacena el valor 13.001.
- La variable str de tipo String almacena el valor D12 — la dirección de la primera celda del objeto que contiene el texto.
Un objeto de tipo String (que contiene el texto) se almacena en un bloque de memoria aparte. La dirección de su primera celda se guarda en la variable str.
4. Qué ocurre cuando asignamos
Otra cosa importante: cómo funciona la asignación. Por ejemplo:
int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10
En este ejemplo se crean dos celdas en memoria: una para a y otra para b. Cuando escribimos b = a;, se copia el valor (10), no la «caja» en sí. Los cambios en b no afectan en absoluto a a.
Ahora, algo similar pero con cadenas:
String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"
Aquí, ambas variables s1 y s2 apuntan a la misma cadena "Hello" hasta el momento de la modificación. Pero cuando ejecutamos s2 = s2 + " World";, para s2 se crea una nueva cadena "Hello World", mientras que s1 sigue apuntando a la cadena antigua "Hello".
5. Por qué en programación casi todo se numera desde cero
A la gente a menudo le sorprende por qué en programación casi en todas partes se cuenta desde cero. El caso es que hay muchas situaciones en las que contar desde cero es más conveniente (aunque también hay situaciones en las que es más cómodo contar desde 1).
Voy a proponer una analogía. Estás en una cola larga en una tienda. Y la persona de la caja dice que todos los clientes, a partir del 20, pasen a la segunda caja. ¿Qué números tendrán? 20, 21, 22, 23, ... Lógico. ¿Y respecto al 20? 0, 1, 2, 3, ...
Cuando definimos un grupo como «número del primer elemento» + «cantidad», dentro del grupo los índices relativos son +0, +1, +2, ...
En programación es lo mismo. Si a tu variable le han asignado 100 bytes de memoria y tienes X — la dirección del primer byte, ¿cuáles serán las direcciones de todos los bytes? X+0, X+1, X+2, ..., X+99. Así obtenemos un grupo de bytes con índices 0, 1, 2, 99.
Cuando pensamos en una dirección relativa dentro de algún bloque de datos, siempre obtenemos una numeración desde cero. Esta es la primera y más frecuente razón para contar desde cero.
GO TO FULL VERSION