Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 13-11-23 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vale, pues vamos a entender un poquito por dentro esto de los Arrays, ¿vale?
00:00:00
Entonces, venced la pérdida mental, porfa, e intentad escuchar.
00:00:06
Porque uno podría hacer ejercicios de Arrays, por lo que hemos visto hasta ahora,
00:00:10
y podría llegar hasta aprobar algún examen, pero vamos, duraría dos, tres diarios.
00:00:16
Las cosas hay que entenderlas, hay que entenderlas para no caerse
00:00:21
en cuanto uno da un paso fuera de lo básico.
00:00:26
Bueno, pues entonces, ¿qué estamos haciendo en realidad cuando declaramos,
00:00:31
qué es lo que está pasando, quiero decir,
00:00:36
qué es lo que está pasando en realidad cuando declaramos un Array?
00:00:38
Pongo siempre el ejemplo de enteros porque es el más sencillo,
00:00:41
el que estamos más acostumbrados a los números,
00:00:44
pero me da igual que el Array sea de enteros que de números decimales, me da lo mismo.
00:00:46
Bueno, vamos a suponer que hemos declarado aquí un Array de números,
00:00:50
y además hemos dicho que para usarlo tenemos que definir un tamaño en memoria,
00:00:55
que eso no hay otra, antes de yo poder usarlo.
00:01:02
Y eso lo hacemos de esta manera, new, espacio, el tipo de dato, y ahora aquí el tamaño.
00:01:05
Vamos a suponer que es 20, bueno, pues 20.
00:01:13
Vale, ¿qué está pasando físicamente en memoria principal?
00:01:16
Pues en la memoria RAM, automáticamente la máquina virtual reserva un espacio,
00:01:19
reserva un espacio para tantas posiciones, tantas como hayamos dicho aquí.
00:01:28
¿Vale?
00:01:37
Sí, Daniel, para tantas como hayamos dicho aquí, si hemos dicho 20, para 20.
00:01:39
Y además sabemos que esta puedo acceder a ella mediante el nombre número 0,
00:01:50
a esta podré acceder mediante el nombre número 1, y así a todas,
00:01:58
hasta esta final, a la que podré acceder con el nombre números, ¿qué?
00:02:05
19.
00:02:14
¿Vale?
00:02:17
Vale, entonces números 0, números 1, números 2, ya sabemos lo que es,
00:02:19
pero ¿y números?
00:02:23
¿Números qué es?
00:02:24
Números es algo, para la máquina virtual es algo, porque de hecho aquí
00:02:25
lo hemos usado para hacer esta asignación, lo hemos usado.
00:02:29
Es decir, no nos estamos limitando a usar, ah bueno, que no estáis viendo ahí nada.
00:02:34
Vale.
00:02:40
Es decir, la variable número suelta ya es algo.
00:02:41
Números 0 tenemos claro lo que es.
00:02:44
Cuando yo escribo números 0, tenemos claro lo que es, es este espacio, este espacio.
00:02:46
Y si yo le asigno 7, ya sabemos que asignamos 7 a este espacio.
00:02:54
Si yo escribo números 3, también tengo claro lo que es.
00:02:58
Números 3 es este espacio, 0, 1, 2, 3, este, este es números 3.
00:03:04
Y si yo le asigno aquí cualquier cosa, pues por ejemplo, números 0 por 3,
00:03:10
por ejemplo, pues sé que a números 3, que es este, le estoy asignando lo que tenga este,
00:03:17
que es números 0 multiplicado por 3.
00:03:22
Vale, hasta ahí es lo que hemos estado usando.
00:03:24
Una vez declarado un array y reservado su espacio, hemos usado sus posiciones individuales.
00:03:27
¿Vale? Eso es lo que nosotros ya, hasta ahora, hemos estado usando
00:03:33
y se supone que tenemos ya entendido y clarísimo cómo funciona.
00:03:37
Vale, pero siguiente salto.
00:03:42
¿Y la variable números ella sola quién es?
00:03:45
¿Esta variable números quién es?
00:03:50
Porque ya la hemos usado en el ejemplo que hemos puesto antes, porque yo tenía dos arrays
00:03:52
y a números 1 le he asignado números 2.
00:03:56
Esto lo he hecho.
00:04:01
Y el compilador lo ha parecido muy bien.
00:04:03
Ha dado un error, pero habrá que ver porque lo ha dado,
00:04:05
pero números 1 es una variable igual.
00:04:07
En este caso, números.
00:04:11
Entonces, la pregunta que nos hacemos es
00:04:13
¿y este término, números solo, sin el 0, sin el 1, sin el 2, a qué se refiere?
00:04:17
Porque con el 0, con el 1, con el 2, ya sabemos a qué se refiere a estas posiciones,
00:04:23
a estas posiciones, ya lo sabemos.
00:04:27
Pero números ella solita, ¿números a qué se refieren?
00:04:29
Pues números ella sola, sin índice, sin índice, números, es también una variable,
00:04:34
un espacio en memoria, también lo es, también lo es, es un espacio en memoria.
00:04:39
¿Y este espacio en memoria qué tiene?
00:04:44
Pues tiene una dirección de memoria, tiene una dirección,
00:04:47
y la dirección que tiene es la dirección donde está colocado el array.
00:04:52
Luego, en realidad, lo que físicamente está apareciendo en la memoria RAM
00:04:58
cuando hacemos esto es
00:05:02
un espacio para guardar una dirección de memoria.
00:05:06
Este espacio se llama números, este espacio se llama números.
00:05:09
Y luego está apareciendo, después de hacer esto,
00:05:14
está apareciendo un espacio con 20 posiciones, las que sean,
00:05:17
y la dirección de memoria, la dirección donde está este espacio,
00:05:20
colgando a partir de él, está contenida aquí.
00:05:25
Esto es lo que físicamente ha aparecido.
00:05:28
Lo que pasa es que a nosotros lo que nos interesa son estas posiciones
00:05:31
que es donde están nuestros datos.
00:05:33
Es esto lo que nos interesa.
00:05:35
Por eso nosotros usamos números 0, números 1, números 2,
00:05:37
porque nos interesan estas posiciones.
00:05:39
¿Vale?
00:05:41
Esta variable números por sí misma,
00:05:42
ella, lo que tiene es la dirección de memoria,
00:05:44
entonces esa variable en sí, esta dirección me da igual.
00:05:47
Esta dirección me da igual.
00:05:49
Lo que pasa es que la máquina virtual
00:05:51
necesita que esto esté montado así.
00:05:53
Porque cuando yo le digo a la máquina virtual, le digo
00:05:56
números 0 igual a 1,
00:06:02
cuando yo le digo esto,
00:06:04
ella físicamente lo que hace es
00:06:06
coge números,
00:06:09
coge números,
00:06:11
coge números,
00:06:13
coge números,
00:06:15
se va a esta dirección de memoria,
00:06:17
a través de esta dirección de memoria,
00:06:19
viaja hasta aquí.
00:06:21
Ahora suma tanto como el índice,
00:06:23
que es 0, se queda aquí,
00:06:25
que es 3, baja hasta 3.
00:06:27
O sea, cuando yo digo esto,
00:06:29
en realidad se desencadena toda esa acción.
00:06:31
La máquina virtual viaja a esta dirección
00:06:33
que está recogida aquí,
00:06:35
viaja a esta dirección,
00:06:37
a través de esta dirección viaja hasta aquí,
00:06:39
y a través del índice ya viaja hasta donde toca.
00:06:41
Todo eso es lo que hace.
00:06:43
Para nosotros es muy sencillo,
00:06:45
para nosotros es números 3 igual a 1,
00:06:47
ya sabemos que el efecto final es este.
00:06:49
Pero lo que está ocurriendo físicamente es esto que digo,
00:06:51
y la estructura que hay en memoria montada
00:06:53
es esta,
00:06:55
es esta,
00:06:57
es esta, ¿vale?
00:06:59
Bueno, pues entonces,
00:07:03
el saber que esto es así,
00:07:05
que esto está así montado,
00:07:07
nos permite ya entender muchas cosas
00:07:09
que pasan con array y trabajar con cosas.
00:07:11
Por ejemplo,
00:07:13
vamos a ver el caso de antes.
00:07:15
Yo tenía números 1
00:07:17
que era un array
00:07:19
de 10 posiciones.
00:07:21
Vale, pues ya está,
00:07:23
el ejercicio que hemos hecho antes.
00:07:25
Pues en el ejercicio que hemos hecho antes,
00:07:31
esta sería la estructura que se queda montada.
00:07:33
Aparece una variable en memoria,
00:07:35
números 1,
00:07:37
que tiene una dirección de memoria.
00:07:39
La dirección que se va a suponer,
00:07:41
donde está todo esto es la dirección de memoria,
00:07:43
pues yo qué sé,
00:07:45
dirección de memoria 37,
00:07:47
por poner cualquier chorrado.
00:07:49
Pues entonces, esta variable
00:07:51
tendrá la dirección de memoria
00:07:53
y guardadita, una dirección de memoria,
00:07:55
ahí guardada la tiene.
00:07:57
Entonces la dirección de memoria,
00:07:59
la máquina virtual,
00:08:01
la selecciona automáticamente la que le da la gana
00:08:03
en función de donde vea
00:08:05
a ella que hay espacio.
00:08:07
No le decimos nosotros donde tiene que colocar
00:08:09
este array, a partir de qué dirección,
00:08:11
lo selecciona ella automáticamente.
00:08:13
Aquí tengo espacio, lo coloco aquí el array
00:08:15
y ahora la dirección a partir
00:08:17
de la cual lo he colocado la pongo aquí,
00:08:19
en ese espacio.
00:08:21
Bueno, pues con esta declaración
00:08:23
hemos montado esta estructura.
00:08:25
Vamos a hacer ahora la otra
00:08:27
que teníamos.
00:08:29
La otra que teníamos
00:08:31
era esta.
00:08:33
Números2
00:08:37
igual a
00:08:39
newIn de 5.
00:08:41
Este segundo array tenía sólo
00:08:43
5 posiciones, 5.
00:08:45
Entonces al tener sólo 5
00:08:47
la estructura que se queda en memoria
00:08:49
es esta.
00:08:51
Números
00:08:53
2
00:08:55
Se le asigna
00:08:57
la dirección de memoria, la dirección que sea,
00:08:59
la que la máquina virtual encuentre que le interesa.
00:09:01
Yo qué sé, imaginaos que es esta.
00:09:03
Y esta dirección de memoria
00:09:05
le lleva a un espacio
00:09:07
en memoria RAM, en este caso
00:09:09
con 5 posiciones sólo.
00:09:11
¿Vale? Y este espacio
00:09:15
estará a partir de la dirección 72.
00:09:17
Bueno, pues esta es la estructura
00:09:19
que se ha montado como
00:09:21
consecuencia de hacer esta sentencia de aquí.
00:09:23
¿Vale? Está la variable
00:09:25
números2 con una dirección
00:09:27
y esta dirección lleva a donde están
00:09:29
ya las posiciones. Entonces cuando hagamos
00:09:31
números2 de 0
00:09:33
sabemos que es esta, porque la máquina virtual
00:09:35
cogerá números2, viajará hasta aquí
00:09:37
y sería la 0. Cuando hagamos números2 de 1
00:09:39
pues sabemos que es esta. ¿Vale?
00:09:41
Pero lo que está en memoria es todo esto de aquí.
00:09:43
Bueno, pues ahora vamos a
00:09:45
hacer esa sentencia
00:09:47
que hemos hecho ahí probando.
00:09:49
La sentencia que hemos hecho
00:09:51
era esta. Bueno, vamos a suponer que
00:09:53
hemos rellenado los estos, los hemos rellenado
00:09:55
este tiene 7, 3, 4
00:09:57
menos 1, 2, 5
00:09:59
yo que sé, cualquier cosa.
00:10:01
Y este tiene 7, 3, 4
00:10:03
menos 1, 5.
00:10:05
Vale.
00:10:07
Eh...
00:10:09
Ahora vamos a hacer esa sentencia que hemos probado.
00:10:11
A números2
00:10:15
a números1
00:10:17
creo que era
00:10:19
sí, a números1
00:10:21
asígnale
00:10:23
números2
00:10:27
¿Vale? Esta es la sentencia que hemos probado.
00:10:29
¿Qué hemos dicho?
00:10:31
La sentencia para el compilador maravillosa
00:10:33
porque son dos variables del mismo
00:10:35
tipo. Las dos son de tipo
00:10:37
a raíz de enteros. Números1 es a raíz de
00:10:39
enteros y números2 es a raíz de enteros.
00:10:41
Luego el compilador asigna una variable a otra
00:10:43
que son del mismo tipo, fenomenal.
00:10:45
Vale, luego esa sentencia es estupenda. Y ahora la pregunta
00:10:47
es, ¿pero qué está pasando físicamente
00:10:49
cuando hacemos la sentencia?
00:10:51
Bueno, ahora ya sabemos que
00:10:53
números1 es una variable que tiene esta dirección de memoria
00:10:55
y números2 es esta
00:10:57
otra que tiene esta dirección de memoria.
00:10:59
Entonces, si yo hago, oye,
00:11:01
a números1 asígnale números2
00:11:03
¿qué estoy haciendo? Pues
00:11:05
a números1 le piso
00:11:07
esta dirección que tenía, fuera, la basura
00:11:09
y le asigno la que
00:11:11
tiene números2, que
00:11:13
es esta.
00:11:15
Esto es lo que estoy haciendo si hago esto.
00:11:17
¿Verdad? A esto
00:11:19
le piso lo que
00:11:21
tenía y le asigno esta.
00:11:23
Con lo cual este enlace se rompió.
00:11:25
Esto desapareció.
00:11:27
Y automáticamente números1
00:11:29
empieza a apuntar
00:11:31
al mismo sitio
00:11:33
que el otro.
00:11:35
¿Vale? Esto es lo que estamos
00:11:37
haciendo. No es que estemos copiando el
00:11:39
contenido de este array en este array.
00:11:41
No estamos haciendo eso
00:11:43
cuando hacemos esta sentencia.
00:11:45
Lo que hacemos es, oye, ojo,
00:11:47
a la dirección de memoria que tenía
00:11:49
números1, písala
00:11:51
llevaba un array, llevaba un array
00:11:53
pues písala y asígnala la dirección
00:11:55
que tenía números2, que es esta.
00:11:57
Entonces ahora las dos tienen la misma dirección, esta y esta
00:11:59
las dos. Luego los dos arrays
00:12:01
llevan al mismo sitio.
00:12:03
Luego ahora son físicamente el mismo.
00:12:05
Los he convertido en físicamente
00:12:07
el mismo, que es este. ¿Y este
00:12:09
qué le ha pasado?
00:12:11
Se ha quedado sin nadie
00:12:13
que le apunte. Ahí sigue.
00:12:15
En memoria reservado.
00:12:17
Pero no hay absolutamente ninguna
00:12:19
variable que le apunte. Conclusión, este array
00:12:21
es inaccesible.
00:12:23
Nunca jamás, desde el programa, nunca
00:12:25
jamás se va a poder acceder aquí.
00:12:27
Se queda absolutamente inaccesible.
00:12:29
Entonces,
00:12:31
precisamente para que las cosas inaccesibles
00:12:33
no estén ahí
00:12:35
engrosando la memoria, ocupando memoria
00:12:37
porque tiene una memoria ocupada, la máquina virtual
00:12:39
no puede disponer de ella.
00:12:41
Pues como se ha quedado inaccesible, esto ya es un agujero
00:12:43
negro. Es imposible
00:12:45
llegar aquí. No hay ninguna variable
00:12:47
que tenga una dirección de memoria que lleve aquí.
00:12:49
Pues como esto se ha quedado en agujero negro,
00:12:51
existe en Java,
00:12:55
la máquina virtual de Java tiene un pequeño proceso
00:12:57
que es el que se llama
00:12:59
el recolector de basura
00:13:01
o el garbage collector.
00:13:03
Y el recolector de basura es un proceso que está
00:13:05
cada pocos milisegundos
00:13:07
tirando a la basura
00:13:09
todo lo que se ha quedado colgando
00:13:11
de la nada, sin nadie que le apunte.
00:13:13
Pues después de haber hecho esta
00:13:15
sentencia, este
00:13:17
se ha quedado colgando de la nada.
00:13:19
Inaccesible, se acabó. Esto no se va a poder
00:13:21
usar nunca. Entonces el recolector
00:13:23
de basura, el solito, va detectando
00:13:25
estas situaciones
00:13:27
y dice, ah, fuera, este inaccesible
00:13:29
a la basura, lo tira
00:13:31
y ya hace disponible esa memoria
00:13:33
para los futuros
00:13:35
usos de la máquina virtual.
00:13:37
El recolector de basura lo tiró.
00:13:41
Y ahora ya, números
00:13:43
1 y números 2 son físicamente
00:13:45
lo mismo. Tengo dos variables
00:13:47
distintas, pero
00:13:49
las dos tienen la misma dirección de memoria
00:13:51
y las dos llevan al mismo sitio.
00:13:53
Claro, por eso cuando
00:13:55
en nuestro código hemos recorrido ahora
00:13:57
números 1, lo hemos recorrido
00:13:59
hasta 10, creyendo que recorríamos esto.
00:14:01
Pues no.
00:14:03
Cuando nos hemos pasado del 5,
00:14:05
no se ha salido una raíz y no se ha salido un exception,
00:14:07
porque números 1, después de haber hecho esta asignación,
00:14:09
ahora es este.
00:14:11
Ahora es este.
00:14:13
Entonces ya no podemos pasarnos de ahí,
00:14:15
porque ahora es este físicamente.
00:14:17
Por eso nos ha salido la raíz e índice
00:14:19
va a un excepción.
00:14:21
¿Vale?
00:14:23
Entonces,
00:14:25
importantísimo entender
00:14:27
que esto por sí mismo, eso solo,
00:14:29
sin un índice puesto asociado,
00:14:31
sin un índice puesto
00:14:33
como este, 0, 1, 2, eso,
00:14:35
es una variable también,
00:14:37
pero es una variable que lo que tiene es una dirección.
00:14:39
Y a través de esa dirección,
00:14:41
poniendo yo ya aquí el índice que sea,
00:14:43
ya puedo acceder
00:14:45
a una posición.
00:14:47
¿Vale?
00:14:49
Entonces, acostumbrémonos a este concepto
00:14:51
de dirección de memoria.
00:14:53
¿Por qué?
00:14:55
Ahora ya, cuando empecemos a ver las clases
00:14:57
y objetos, ya todo lo que vamos a manejar son objetos.
00:14:59
Y los objetos son direcciones
00:15:01
de memoria.
00:15:03
Y de entender bien toda la complejidad que va por debajo,
00:15:05
se deriva
00:15:07
que nuestros programas
00:15:09
que compilarán perfectamente
00:15:11
y estarán todos estupendos, valgan para algo
00:15:13
o no valgan para nada.
00:15:15
De que entendamos bien esa complejidad.
00:15:17
Bueno, pues,
00:15:19
¿esto está entendido?
00:15:21
Sí, seguro.
00:15:23
Bueno, pues en esta situación,
00:15:27
este se fue a la basura porque el conductor de basura
00:15:29
ha dicho, oye, te has quedado
00:15:31
sin nadie
00:15:33
que te referencie.
00:15:35
Sin nadie, pues tú fuera, no vales para nada.
00:15:37
¿Vale?
00:15:39
Entonces, ahora ya,
00:15:41
después de esa situación, se nos ha quedado
00:15:43
esta y esta.
00:15:45
¿Vale?
00:15:47
Imaginaos que ahora digo yo, oye, pues
00:15:49
ahora quiero que números 2
00:15:51
me apunten,
00:15:53
no quiero yo que apunten los dos al mismo.
00:15:55
Vaya desperdicio de memoria.
00:15:57
Pues, por ejemplo,
00:15:59
si quiero que números 2 ahora
00:16:01
me apunte a otro array distinto que me voy a crear.
00:16:03
Puedo hacerlo sin ningún problema.
00:16:05
Imaginaos que ahora hacemos esto.
00:16:07
Cada vez que yo haga
00:16:11
esto,
00:16:13
por ejemplo,
00:16:15
es decir,
00:16:17
imaginaos que a una variable array
00:16:19
que yo tengo declarada, le vuelvo a hacer
00:16:21
otro new int, porque me da la gana, le vuelvo a hacer
00:16:23
otro new int. ¿Vale? Pues le vuelvo a hacer otro new int.
00:16:25
Pues, ¿qué pasa cada vez que
00:16:27
hacemos un new int?
00:16:29
Cada vez que hacemos un new int,
00:16:31
se crea un espacio en memoria.
00:16:33
En este caso, de dos posiciones,
00:16:35
la 0 y la 1.
00:16:37
Y este espacio en memoria se queda apuntado
00:16:39
por números 2.
00:16:41
Imaginaos que este espacio en memoria, pues,
00:16:43
se ha creado ahí, con la posición 0 y la 1.
00:16:45
¿Vale? El new int
00:16:47
lo que hace es crear espacio en memoria.
00:16:49
Y ahora,
00:16:51
el espacio en memoria, la dirección,
00:16:53
se guarda
00:16:55
en la variable que esté aquí, números 2.
00:16:57
Con lo cual, números 2, ahora ya
00:16:59
dejaría de tener la dirección
00:17:01
del otro, empezaría a tener
00:17:03
la de este que acabo de crear.
00:17:05
Con lo cual, este enlace se rompe.
00:17:09
Y ahora, números 2,
00:17:11
empieza a apuntar a este.
00:17:13
¿Vale? Empieza a apuntar aquí.
00:17:17
Porque yo he
00:17:19
creado un espacio, ese espacio está en una
00:17:21
dirección, y esa dirección se guarda en la variable
00:17:23
que yo ponga aquí.
00:17:25
Y ahora ya tendría números 1 apuntando a este.
00:17:27
Y números 2
00:17:29
apuntando a este otro.
00:17:31
¿Vale? Más o menos.
00:17:39
Es decir,
00:17:41
vamos a recopilar un poco.
00:17:43
Vamos a revisar entonces
00:17:45
qué estamos haciendo realmente cuando hacemos
00:17:47
esta sentencia.
00:17:49
Ahora ya vamos a analizarla un poco mejor.
00:17:51
Esta de aquí.
00:17:57
Esta, que es la que hemos
00:17:59
plantado siempre a Capón, cuando queríamos
00:18:01
usar un array de números
00:18:03
2, 3, 4, 5, 6, 7,
00:18:05
8, 9, 10, 11,
00:18:07
12, 13, 14, 15,
00:18:09
16, 17, 18, 19,
00:18:11
cuando queríamos usar un array
00:18:13
de emperos o lo que fuera de x posiciones.
00:18:15
¿Pues qué estamos haciendo?
00:18:17
Bueno, pues la primera parte,
00:18:19
esta,
00:18:21
uno la podría poner suelta, así.
00:18:23
Es decir, en realidad podríamos hacer
00:18:27
primero la declaración del array.
00:18:29
Imaginaos que yo hago esta
00:18:31
primera parte sin más.
00:18:33
Bueno, pues con esta primera parte
00:18:35
que estamos declarando,
00:18:37
una variable números,
00:18:39
una variable números,
00:18:41
pensada
00:18:43
para contener una dirección
00:18:45
de memoria.
00:18:47
Y esta dirección de memoria,
00:18:57
¿ahora mismo a dónde estaría apuntando?
00:18:59
A nada, porque mientras yo no
00:19:01
creo un espacio,
00:19:03
esta variable números
00:19:05
se ha creado, ha aparecido,
00:19:07
pensada para contener la dirección de memoria,
00:19:09
pero ahora mismo, mientras yo no le haga el newInt,
00:19:11
no apunta a nada.
00:19:13
Esto se le llama
00:19:15
apuntar a null.
00:19:17
¿Vale?
00:19:19
De hecho, si hiciérais ahora, solamente
00:19:21
con esta sentencia, luego un system out
00:19:23
de números, se pondría null.
00:19:25
Se diría, oye, ¿qué tiene esta variable
00:19:27
de números? Tiene null, una dirección de memoria
00:19:29
que es null, no apunta a nada.
00:19:31
Vale, entonces con este array
00:19:33
no podemos hacer nada, obviamente,
00:19:35
porque es una dirección de memoria que apunta a nada.
00:19:37
Aquí no hay espacio ni nada.
00:19:39
Ahora queremos crear el espacio.
00:19:41
Pues para crear el espacio,
00:19:43
ahora ya sí que hay que hacer el newEste.
00:19:45
Números
00:19:55
igual
00:19:59
a newInt
00:20:01
de 3, por ejemplo.
00:20:03
Vale.
00:20:05
Ahora ya, con newInt,
00:20:07
ya se crea el espacio.
00:20:09
Vale, con esto se crea.
00:20:11
Ala, muy bien, ya tenemos el espacio, en este caso,
00:20:13
para 3.
00:20:15
Este espacio la máquina virtual decide crearlo
00:20:17
donde le pete.
00:20:19
Imaginaos que lo crea en esta dirección.
00:20:21
Ahí lo crea.
00:20:23
Y ahora la dirección de memoria donde está ese
00:20:25
espacio creado, la guarda
00:20:27
en la variable que hay aquí.
00:20:29
Vale, pues como resultado de esta sentencia,
00:20:31
no solo se crea el espacio,
00:20:33
sino que esta dirección, ahora ya,
00:20:35
se guarda ahí.
00:20:37
Eso significa
00:20:41
que este array ha dejado ya de apuntar
00:20:43
a null, y este array empieza
00:20:45
a apuntar aquí.
00:20:47
Y ya podemos empezar a trabajar.
00:20:49
Ahora ya, números 0 es alguien,
00:20:51
números 1 es alguien, números 2 es alguien.
00:20:53
Antes de hacer esto, números 0 es nada.
00:20:57
Ahora veremos lo que es. Error, nada.
00:20:59
Pero una vez hecho esto,
00:21:01
ahora ya sí, porque ya hay espacio en memoria.
00:21:03
Entonces,
00:21:05
¿que lo hago en dos líneas separadas o en una?
00:21:07
Me da igual.
00:21:09
Más cómodo en una, ¿no? Más cómodo.
00:21:11
Pero entended que son dos ideas.
00:21:13
Dos ideas.
00:21:15
Esto declara la variable
00:21:17
con la dirección de memoria de donde va a estar
00:21:19
el array, pero mientras el array no esté creado,
00:21:21
esto apunta a null.
00:21:23
Y ahora esto ya sí que
00:21:25
crea el espacio. Esto ya sí.
00:21:27
¿Vale?
00:21:31
Entonces, con esta variable se puede trabajar
00:21:33
por separado, pero se puede trabajar sabiendo que es una
00:21:35
dirección de memoria. Que ahora me dicen,
00:21:37
oye, hazte una copia de este array.
00:21:39
O sea, yo podría hacer esto, por ejemplo,
00:21:41
int
00:21:43
números 2
00:21:49
y a números 2, oye, asígnale
00:21:51
números.
00:21:53
Pues esto es una sentencia
00:21:55
perfectamente normal. ¿Qué estoy haciendo
00:21:57
aquí? Declarar una
00:21:59
variable números 2
00:22:01
así, pensada
00:22:07
para contener un array. Luego esto es una dirección
00:22:09
de memoria. Está pensada
00:22:11
para una dirección de memoria. Vale.
00:22:13
Y ahora, a esta variable números 2
00:22:15
que tiene una dirección de memoria, ¿qué le
00:22:17
asignamos? La dirección
00:22:19
que está en números. ¿Vale? Muy
00:22:21
bien. Le asignamos lo que tiene números.
00:22:23
Que tiene 23. Muy bien.
00:22:25
Le asignamos el 23.
00:22:27
¿Eso qué significa? Que números 2
00:22:29
automáticamente se queda
00:22:31
apuntando aquí. Luego
00:22:33
con esta sentencia estoy
00:22:35
creando dos direcciones de memoria
00:22:37
que me llevan al mismo array.
00:22:39
¿Vale?
00:22:43
¿Qué implicaciones tiene esto?
00:22:45
Que si yo hago
00:22:47
números de 0
00:22:49
igual a 3.
00:22:51
Pues está claro.
00:22:53
Números de 0 se apunta un 3.
00:22:55
Y ahora muestro
00:22:57
números 2
00:23:03
de 0
00:23:05
Uno podría pensar, oye, que
00:23:07
números 2, yo no le he dado ningún valor.
00:23:09
A ver, es que números 2 tiene una dirección
00:23:11
de números. Luego te apunta al mismo sitio. Luego
00:23:13
si muestras esto, números 2 de 0 te va
00:23:15
a dar el 3 también. Porque es el mismo
00:23:17
físicamente. Es el mismo.
00:23:19
¿Vale? Entonces
00:23:21
como números 2
00:23:23
tiene la copia de esta dirección
00:23:25
todos los cambios que yo haga a través
00:23:27
de números
00:23:29
los voy a poder acceder a través de números 2
00:23:31
también. Porque los dos apuntan
00:23:33
al mismo lado. Los dos apuntan al mismo sitio.
00:23:35
¿Vale?
00:23:39
Bueno, pues es muy importante entender esto
00:23:41
y que lo reviséis y que lo
00:23:43
tengáis muy muy claro y entendido. Es la
00:23:45
base, en realidad, de la programación
00:23:47
frente a objetos. Esta idea
00:23:49
entender que una cosa es la dirección de memoria
00:23:51
donde están los datos y otra cosa
00:23:53
son los datos.
00:23:55
¿Vale? Y que a unos datos se puede
00:23:57
acceder desde un montón
00:23:59
de variables siempre y cuando
00:24:01
esa tengan la misma dirección.
00:24:03
¿Vale?
00:24:07
Vale, pues...
00:24:11
Si...
00:24:17
A ver...
00:24:21
Ahora...
00:24:33
...
00:24:51
Vale, pues entonces, el ejercicio en el que estábamos.
00:25:03
En el que estábamos.
00:25:15
Ahora ya entendemos
00:25:17
lo que ha pasado, ¿verdad?
00:25:19
Después de haber copiado
00:25:21
en números 1 y números 2
00:25:23
la dirección números
00:25:25
1 me apunta al mismo sitio que números
00:25:27
2. Con lo cual, números 1 y números
00:25:29
2 ahora son lo mismo.
00:25:31
Luego este 10 era el problema.
00:25:33
Ahora, números 1
00:25:35
solo me llega hasta 5. Solo me
00:25:37
llega hasta 5. Si yo intento
00:25:39
recorrerlo hasta 10, me pasa lo que me ha pasado.
00:25:41
Que cuando me rebaso
00:25:43
de la posición 4...
00:25:45
¿Vale?
00:25:47
Ese ha sido el problema.
00:25:49
Vamos a ponerlo aquí.
00:25:51
Ahora, números
00:25:55
1 y
00:25:57
números 2 apuntan
00:26:01
al mismo sitio.
00:26:05
Luego, números
00:26:11
1 solo tiene
00:26:13
5 posiciones.
00:26:15
¿Vale? Entonces, si yo quiero recorrer
00:26:19
números 1
00:26:21
tiene que tener 5.
00:26:23
Ahora ya esto no me da error
00:26:27
de ejecución.
00:26:29
Ese es el primer array que hemos hecho, con posiciones aleatorias.
00:26:31
Ese es el segundo que hemos
00:26:33
hecho, con posiciones aleatorias.
00:26:35
Luego, hemos ido
00:26:37
posición por posición copiando
00:26:39
uno en otro. Aquí no hemos
00:26:41
alterado las direcciones de memoria y nada.
00:26:43
Números 2 sigue apuntando a este array
00:26:45
y números 1 a este.
00:26:47
Lo que hemos hecho ha sido ir copiando las posiciones.
00:26:49
Pero es distinto ir copiando posiciones una tras otra
00:26:51
que ¡paf! de golpe mueve la dirección
00:26:53
entera. Ahora,
00:26:55
hemos asignado directamente números 1 y números 2.
00:26:57
Pues ahora ya, números
00:26:59
1 y números 2 son lo mismo.
00:27:01
Van al mismo sitio.
00:27:03
Y hemos mostrado el mismo array
00:27:05
dos veces.
00:27:07
Vamos a poner aquí otro ejemplo.
00:27:13
Ejemplo 4.
00:27:25
Ejemplo 5.
00:27:27
Solo tiene 5 posiciones.
00:27:41
Vamos a hacer rápidamente
00:27:57
eso que hemos visto en
00:27:59
la pizarra. Yo tengo mis dos
00:28:01
arrays. Ahora mismo solo son
00:28:03
direcciones de memoria que no apuntan a nada.
00:28:05
Vamos a mostrar a ver
00:28:07
qué me sale que tienen.
00:28:09
Números 1.
00:28:11
¿Vale?
00:28:13
¿Qué me dice?
00:28:15
Números 1 no está
00:28:17
inicializada.
00:28:19
Es una dirección de memoria pero que
00:28:21
apunta a null. No está inicializada.
00:28:23
Entonces,
00:28:25
vamos a inicializarla.
00:28:27
Pues venga, números 1 igual.
00:28:29
Le vamos a asignar
00:28:31
un array de
00:28:33
10 posiciones, por ejemplo.
00:28:35
Ahora ya,
00:28:37
números 1 ya apunta a un
00:28:39
espacio de 10 posiciones
00:28:41
consecutivas a las que pueda acceder
00:28:43
con 0, 1, 2.
00:28:45
¿Y ahora qué vamos a hacer con números 2?
00:28:47
A números 2 le vamos a asignar
00:28:49
números 1.
00:28:51
Luego, números 2 y números 1
00:28:55
apuntan al mismo sitio.
00:28:57
Números 1 y números
00:29:01
2
00:29:03
se han
00:29:05
quedado apuntando
00:29:07
al mismo sitio.
00:29:11
Vamos a comprobarlo.
00:29:15
Vamos a asignar valores a números 1
00:29:17
y luego vamos a recorrer números 2.
00:29:19
Vamos a rellenar
00:29:21
números 1.
00:29:23
Pues venga,
00:29:25
tras i sea menor que
00:29:31
10, era.
00:29:33
En lugar de por teclado
00:29:35
vamos a rellenarlo con números aleatorios.
00:29:37
Números 1
00:29:41
de i
00:29:43
le vamos a asignar
00:29:45
y le vamos a
00:29:47
asignar
00:29:49
punto random
00:29:53
por 50, números aleatorios
00:29:55
entre 0 y 50.
00:29:57
Hacemos el casting entero
00:30:01
para que...
00:30:03
Vale, el array
00:30:07
números 1 de 10 posiciones está relleno.
00:30:09
Es el único que hemos
00:30:11
rellenado. Ahora
00:30:13
vamos a recorrer el segundo.
00:30:15
Vamos a mostrar lo que tiene
00:30:17
para ver lo que tiene.
00:30:21
En otro bucle
00:30:27
fuera aparte para que el programa quede más claro.
00:30:29
La arrastraron.
00:30:41
Números de i
00:30:45
seguido de
00:30:47
un espacio.
00:30:49
Vale, y pongo
00:30:59
los asteriscos.
00:31:01
Vale, pues a ver.
00:31:03
He rellenado el primero.
00:31:05
Y lo he mostrado.
00:31:07
Vale, pues voy a mostrar el segundo
00:31:11
también. Vamos a mostrarle al segundo.
00:31:13
Que no le hemos rellenado, ni hemos hecho nada
00:31:15
al segundo.
00:31:17
Solo hemos rellenado con esto el primero.
00:31:19
Vamos a mostrar el segundo.
00:31:21
Vale, pues lo hemos mostrado.
00:31:27
Ahora, lo hemos rellenado con
00:31:29
esto el primero. Vamos a mostrar el segundo.
00:31:31
Hago este mismo bucle.
00:31:37
Mostramos el segundo.
00:31:45
Vale, a ver que pasa.
00:31:55
Vale, veis lo que hemos hecho.
00:31:57
No hemos rellenado el primero.
00:31:59
Y sin haber hecho nada
00:32:01
con el segundo, salvo esta asignación,
00:32:03
salvo esta.
00:32:05
Lo mostramos ahora.
00:32:07
Y veis, efectivamente,
00:32:13
a través de números 2, llegamos
00:32:17
al mismo sitio. Llegamos al mismo
00:32:19
array.
00:32:21
Llegamos al mismo.
00:32:23
Este es número 2.
00:32:25
Este es número 1.
00:32:27
Son exactamente el mismo, porque
00:32:29
después de haber hecho esta asignación,
00:32:31
las dos direcciones de memoria
00:32:33
son la misma.
00:32:35
Las dos direcciones van al mismo lado.
00:32:37
Me da igual acceder al array
00:32:39
desde números 1 que desde números 2.
00:32:41
Me da igual. Estoy accediendo a la misma
00:32:43
zona de memoria.
00:32:45
Desde el momento en que he asignado una a la otra.
00:32:47
Estoy accediendo a la misma zona de memoria.
00:32:51
¿Vale?
00:32:57
¿Entendido esto?
00:33:01
Bueno, antes de que os pongáis
00:33:05
a hacer ejercicios,
00:33:07
solo una cosita más
00:33:09
para que sea más cómodo.
00:33:11
Es una tontería.
00:33:13
Aunque nos quedan unas cuantas cosas de array.
00:33:15
Vale, cuando recorremos
00:33:17
un array, ya hemos dicho
00:33:19
que la forma más
00:33:21
práctica y rápida de hacerlos con un
00:33:23
for, porque el for ya me permite
00:33:25
aquí declarar de forma rápida una variable
00:33:27
que empieza variando cero, la voy incrementando
00:33:29
y llego hasta donde yo quiera.
00:33:31
Bueno, pues ya esa variable, ya esa
00:33:33
me vale como índice.
00:33:35
Entonces el for es la forma más práctica
00:33:37
de recorrer un array.
00:33:39
Porque ya esa variable me vale como índice.
00:33:41
Pero el problema es que yo me tengo que
00:33:43
acordar, cuando pongo aquel numerito,
00:33:45
me tengo que acordar
00:33:47
del tamaño que tenía el array.
00:33:49
Para acordarme me tengo que ir arriba
00:33:51
y declarar. Tengo que acordar.
00:33:53
Bueno, eso a veces
00:33:55
vale. Pues el mayor
00:33:57
problema que tiene es que me tengo que ir a ver
00:33:59
uy, ¿cuántos tenía? Diez.
00:34:01
Pero es que hay veces que si el programa consta de varias
00:34:03
partes, como ya veremos, son
00:34:05
funciones aparte, es que es imposible.
00:34:07
Yo físicamente, mirando
00:34:09
mi código, no voy a poder saber
00:34:11
de qué tamaño se declaró
00:34:13
ese array. Hay veces que no voy a poder saberlo.
00:34:15
Porque la parte del código a la que tengo
00:34:17
acceso, es distinta a la
00:34:19
parte del código en la que se declaró.
00:34:21
Eso nos va a ocurrir enseguida, cuando ya tengamos
00:34:23
varias clases. Luego, una situación
00:34:25
así, que ponemos aquí,
00:34:27
es decir, sería
00:34:31
interesante que hubiera una manera
00:34:33
de, dado una variable array,
00:34:35
una dirección de memoria, saber
00:34:37
yo qué tamaño
00:34:39
tiene el array al que apunta.
00:34:41
Sería ideal si eso existiera.
00:34:43
Pues existe.
00:34:45
Si yo tengo una variable array como números
00:34:47
1,
00:34:49
pues tengo una posibilidad
00:34:51
que es esta,
00:34:53
que es
00:34:55
sacar el tamaño
00:34:57
que hay reservado
00:34:59
para ese array números 1.
00:35:01
Entonces, desde el momento que yo
00:35:03
pongo nombre de un array,
00:35:05
.length,
00:35:07
esto es el tamaño
00:35:09
que se reservó cuando se le declaró.
00:35:11
El tamaño que se reservó.
00:35:13
¿Que se reservó 100? Es 100.
00:35:15
Si se reservó 30, será 30.
00:35:17
No tengo que irme aquí a buscar esto.
00:35:19
No tengo que irme a buscarlo.
00:35:21
Es fundamental, porque habrá veces que ni siquiera
00:35:23
tengamos acceso a esa sentencia.
00:35:25
Pero nos da igual.
00:35:27
Entonces, esto es muy cómodo
00:35:29
para hacer recorridos de
00:35:31
for, porque no tengo que andar yo aquí arrastrando
00:35:33
el número. Pongo números 1.length
00:35:35
y ya está, o aquí igual.
00:35:37
Aquí pongo números 2.length
00:35:39
y ya está, ya lo tengo.
00:35:47
De hecho, si ejecutamos
00:35:49
este código, nos va a dar lo mismo.
00:35:51
¿Vale? Porque números
00:35:53
length, números 2.length
00:35:55
¿Vale? Entonces aquí
00:35:57
de nuevo nos liéis.
00:35:59
Uno podría decir, oye, pero números 2.
00:36:01
Yo a números 2 no le hice ningún new.
00:36:03
No le hice ningún ya.
00:36:05
Pero es que a números 2 le hemos asignado números 1.
00:36:07
Con lo cual, números 2 y números 1
00:36:09
es que son lo mismo.
00:36:11
Como son lo mismo, números 2.length
00:36:13
será lo mismo que números 1.length
00:36:15
porque son lo mismo, gracias a esta
00:36:17
asignación que le hemos hecho.
00:36:19
¿Vale?
00:36:25
Pues vamos a subir una primera hoja
00:36:27
de ejercicios.
00:36:29
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 5
- Fecha:
- 13 de noviembre de 2023 - 13:33
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 696.08 MBytes