CodeGym /Cursos /JAVA 25 SELF /Direccionamiento de memoria y variables

Direccionamiento de memoria y variables

JAVA 25 SELF
Nivel 2 , Lección 4
Disponible

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.

memory-excel

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 celdashacer 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
1
Byte, porque ocupa un byte de memoria
short
2
Abreviatura de Short Integer
int
4
Abreviatura de Integer
long
8
Abreviatura de Long Integer

Además, en Java hay 2 tipos de punto flotante — float y double:

Tipo Tamaño, bytes Origen del nombre
float
4
Abreviatura de Floating Point Number
double
8
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).

¡Importante!

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.

memory-string

  • 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.

1
Tarea
JAVA 25 SELF, nivel 2, lección 4
Bloqueada
Perfil del personaje del juego 🎮
Perfil del personaje del juego 🎮
1
Tarea
JAVA 25 SELF, nivel 2, lección 4
Bloqueada
Copiar y modificar datos del proyecto 📝
Copiar y modificar datos del proyecto 📝
1
Tarea
JAVA 25 SELF, nivel 2, lección 4
Bloqueada
Tamaños de datos 📊
Tamaños de datos 📊
1
Tarea
JAVA 25 SELF, nivel 2, lección 4
Bloqueada
Cuentas distintas en el banco 🏦
Cuentas distintas en el banco 🏦
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION