20250930 ProgEstr-Operadores_5 - 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:
descansar un poco, pero antes de ese primer descansito, antes de ese primer descansito vamos a intentar entender esto, ¿vale?
00:00:00
A ver
00:00:13
Vámonos aquí
00:00:15
Entonces
00:00:20
Bueno, el programa de antes
00:00:22
Hemos puesto una cadena igual a Luis
00:00:36
Otro nombre igual a Luis
00:00:38
Y hemos hecho la condición
00:00:40
Nombre 1 igual a nombre 2
00:00:42
Hemos imprimido lo que sale y nos ha salido true
00:00:43
Y habéis dicho
00:00:46
Y habéis pensado
00:00:49
Claro, porque son ellos
00:00:50
pero no debería de salir
00:00:51
el true, debería de salir el false
00:00:54
¿por qué?
00:00:55
que ahí te ha salido el false
00:00:58
¿vale? pues eso ya empieza
00:01:00
a asustarnos ¿verdad? porque uno ha salido
00:01:02
el true, otro ha salido el false
00:01:03
vale, vamos a entender que está pasando con el tipo string
00:01:05
solo con la idea
00:01:08
de empezar poco a poco
00:01:10
a familiarizarnos un poquito
00:01:12
más con el concepto de objeto
00:01:14
porque desde ya
00:01:15
en los primeros ejercicios que hagamos
00:01:17
vais a tener que no usar ese doble igual
00:01:19
para ver si una cadena es igual a otra
00:01:22
porque no funciona correctamente
00:01:25
bueno, funciona perfectísimamente
00:01:27
pero no según la intuición
00:01:29
no según como intuimos
00:01:31
funciona muy bien
00:01:31
lo que funcionamos mal en todo caso
00:01:32
lo haríamos nosotros
00:01:34
vale, pues a ver
00:01:34
tipos primitivos
00:01:36
sabemos perfectamente como funcionan
00:01:37
yo declaro una variable cualquiera
00:01:40
de cualquier tipo primitivo
00:01:43
automáticamente aparece en la RAM
00:01:45
un espacio en memoria
00:01:48
para guardar el dato que sea
00:01:50
con el tamaño correspondiente
00:01:52
y cuando ahora yo hago
00:01:53
n igual a 3, por ejemplo, hago esa sentencia
00:01:55
automáticamente
00:01:58
el 3 va aquí y ya está
00:02:00
que ahora ya hago
00:02:01
pues
00:02:04
otro numerito m
00:02:05
igual a n más 2
00:02:07
pues ya sabemos que la máquina virtual
00:02:09
coge el n
00:02:12
tiene un 3, lo suma, el resultado
00:02:13
lo guarda en la variable m y ya está
00:02:16
Vale. ¿Qué pasa cuando la variable que declaro no es de tipo primitivo, sino de tipo string? Por ejemplo, así. Pues esta variable es un poquito especial, aunque la estamos usando como cualquier otra. Es igual a la cadena que sea. Esta variable es especial, porque esta variable no es de tipo primitivo, sino que es de tipo objeto.
00:02:18
¿qué pasa cuando
00:02:44
la máquina virtual se encuentra que declaramos
00:02:47
una variable de tipo objeto?
00:02:49
pues automáticamente asume
00:02:51
que va a necesitar un espacio gordote
00:02:53
para ella, claro
00:02:55
porque una variable de tipo objeto
00:02:57
va a tener muchas cosas dentro
00:02:58
esta en particular, la string
00:03:00
va a tener muchos caracteres
00:03:03
tampoco es tanto, a menos que fueran
00:03:05
3.000 caracteres, va a tener muchos caracteres
00:03:07
pero habrá variables objeto que tengan
00:03:09
muchas más cosas dentro, números, caracteres
00:03:11
de todo vale pues espacio gordote para ello y para facilitar la gestión de la memoria el acceso a
00:03:13
ella y todo eso además crea en memoria un espacio que es simplemente el que contiene la dirección de
00:03:22
memoria donde está el espacio gordote donde ya está el dato donde está ya la cadena el dato
00:03:34
entonces, todo esto
00:03:42
aparece en memoria
00:03:47
una variable pequeñita
00:03:48
para guardar una dirección
00:03:50
de memoria, ¿vale? ya sabéis
00:03:53
de sistemas informáticos o de donde sea
00:03:55
lo intuís, que la memoria
00:03:57
RAM son un montón de posiciones
00:03:59
una tras otra
00:04:01
donde puede haber datos
00:04:02
y cada una de esas posiciones tiene una dirección
00:04:04
lógicamente, cada posición tiene una dirección
00:04:06
bueno
00:04:08
pues, como resultado
00:04:10
de declarar esto, la máquina
00:04:13
virtual hace aparecer
00:04:15
un espacio grandote para guardar
00:04:16
el dato y luego hace aparecer
00:04:19
otro pequeño espacio donde guarda
00:04:21
la dirección de memoria donde está
00:04:23
el espacio grandote.
00:04:25
Todo esto aparece.
00:04:27
Sin embargo, con una variable
00:04:29
primitiva solamente
00:04:31
ha aparecido el espacio para el dato.
00:04:33
Mi dirección de memoria y nada,
00:04:35
el espacio para el dato. Y n
00:04:37
se refiere al espacio para el dato.
00:04:38
N se refiere a este.
00:04:40
Pero sin embargo, en este caso, S, que es el único identificador que tenemos del que disponemos S, no se refiere al espacio grandote. S se refiere a la dirección de memoria.
00:04:43
entonces cuando la máquina virtual
00:05:03
ve ese
00:05:05
entiende que ese es la dirección de memoria
00:05:07
y a través de la dirección
00:05:10
de memoria ya llega al dato
00:05:12
vale, todo esto
00:05:13
se crea cuando declaramos
00:05:15
la variable string por el hecho de ser
00:05:18
objeto y pasaría
00:05:20
con cualquier otra variable que fuera objeto
00:05:21
no hace falta que fuera string, creo cualquier variable
00:05:23
que sea objeto y se crea
00:05:26
el espacio grandote para el
00:05:27
dato y un pequeño
00:05:30
espacio que guarda la dirección de memoria
00:05:32
del espacio grande
00:05:34
ahora el asunto es, muy bien, todo esto
00:05:35
ha aparecido, y ahora cuando usamos
00:05:38
esta variable
00:05:40
¿cómo actúa la máquina virtual que está pasando
00:05:41
por dentro?
00:05:44
bueno, pues
00:05:46
ahora nosotros hacemos
00:05:47
s
00:05:50
igual a ola
00:05:52
por ejemplo, s igual a
00:05:54
ola, pues ¿qué es lo que
00:05:58
hace la máquina virtual?
00:06:00
la máquina virtual
00:06:01
ve la S
00:06:02
ve que es una dirección de memoria
00:06:04
entonces dice
00:06:07
ah, te refieres
00:06:09
como esto es una dirección de memoria
00:06:11
te refieres a que quieres hacer
00:06:13
esta asignación
00:06:15
al trozo de memoria
00:06:16
al que yo estoy apuntando
00:06:19
te refieres a eso, ah, vale, vale
00:06:21
porque tú eres una dirección de memoria
00:06:23
luego no puede ser que quieras meter la cadena
00:06:25
aquí, porque esto está pensado
00:06:27
para meter direcciones de memoria
00:06:29
No puede ser que quieras meter la cadena aquí
00:06:31
Te refieres a que la quieres meter
00:06:33
A donde tú apuntas
00:06:35
Ah, vale, entonces mete aquí el hola
00:06:37
Todo eso lo haces
00:06:39
Y que nosotros tengamos que preocuparnos por ello
00:06:41
Lógicamente, nosotros lo
00:06:43
Hacemos una asignación, es igual a hola
00:06:45
Pero el hola
00:06:47
No va aquí, no va a lo que se llama ese
00:06:49
El hola va
00:06:52
Al trozo de memoria
00:06:53
Que viene apuntado por esta dirección
00:06:55
Y eso es así
00:06:57
y no tenemos que tenerlo presente en la cabeza
00:07:00
todo el rato
00:07:01
pero
00:07:02
que eso sea así
00:07:04
se pone de manifiesto
00:07:07
a veces ya así en algunas situaciones
00:07:09
que es en la anterior que hemos dicho
00:07:11
vale, entonces
00:07:13
esto está entendido, ¿no?
00:07:15
que esto funciona por dentro así
00:07:17
no es lo mismo una variable objeto, que son dos cosas
00:07:18
el cacho grande para el dato
00:07:21
y el cacho pequeño
00:07:24
que es la dirección de memoria
00:07:26
que lleva el dato
00:07:27
y la variable primitiva
00:07:28
que es solo el cacho pal dado
00:07:31
es distinto
00:07:32
vale, pues entonces ahora, entendido que esto es distinto
00:07:34
vamos a hacer ahora dos variables
00:07:37
string
00:07:39
vale, pues entonces
00:07:39
ahora me hago yo aquí
00:07:52
variable string
00:07:54
s1
00:07:56
y ya de paso que me creo s1
00:07:56
pues le pongo hola
00:07:59
ya de paso
00:08:02
¿qué está pasando en memoria?
00:08:03
todo eso que hemos dicho
00:08:06
se crea un espacio
00:08:07
que se llama S1 que en realidad
00:08:10
es una dirección
00:08:12
que me lleva al espacio
00:08:14
grandote y en este espacio
00:08:16
grandote ahora sí que pone
00:08:18
hola, vale, todo eso
00:08:20
ha pasado, porque el hola ha ido aquí
00:08:22
ahora vamos a
00:08:24
crear otra variable
00:08:26
es lo que hemos hecho antes con nombre1 y nombre2
00:08:27
lo mismo, str
00:08:30
S2
00:08:33
igual a hola también
00:08:34
Vale, pues ¿qué se desencadena como consecuencia de toda esta sentencia? Pues ese 2 hace aparecer un espacio aquí que en realidad es una dirección de memoria que me lleva a un espacio grandote donde ahora ya sí se guarda este hola con el que hemos inicializado.
00:08:36
hola, vale
00:09:00
y la situación de memoria
00:09:04
es esta, vale
00:09:07
ahora vamos a hacer esta condición
00:09:08
esta condición
00:09:11
que sería
00:09:19
S1
00:09:20
igual a S2
00:09:22
que es la que hemos hecho antes
00:09:25
vale
00:09:27
entonces, ¿qué hace la máquina virtual?
00:09:28
me estás dando
00:09:34
S1 doble igual a S2
00:09:35
Pues yo comparo S1 con S2
00:09:37
Y S1 y S2 son
00:09:40
La dirección de memoria
00:09:42
Es esto
00:09:44
Esta dirección es la dirección de aquí
00:09:45
Y esta es la dirección de aquí
00:09:52
Son dos variables distintas
00:09:54
Hombre, lo que pasa es que ahora casualmente
00:09:55
Tienen el mismo texto puesto
00:09:58
Pero si yo a una la cambio
00:09:59
Y ahora hago S2 igual a Dios
00:10:01
Pues S2 cambia
00:10:03
Entonces cuando yo haga esta condición
00:10:04
S1, ¿quién es?
00:10:08
S1 es lo que hay aquí, esta dirección
00:10:10
Y S2, ¿quién es? Lo que hay aquí
00:10:12
Es igual
00:10:14
Es igual, son dos direcciones de memoria distintas
00:10:15
Esta es la dirección de este trozo
00:10:18
Y esta es la dirección de este otro trozo
00:10:20
Con lo cual, esta condición
00:10:23
Es
00:10:26
False
00:10:29
Tal cual, es falso
00:10:30
¿Vale? Ahora veremos por qué nos ha dado cruz en esta prueba
00:10:32
Es falso
00:10:35
Entonces, esta es la conclusión que tenemos que sacar
00:10:37
Ahora, cuando nosotros queremos ver si una cadena es igual a otra, es decir, si una variable string es igual que otra variable string, nunca lo hacemos con este operador, nunca, porque este operador al ser las variables string objetos, lo que me compara son las dos direcciones, las dos direcciones son distintas.
00:10:40
entonces si yo quiero ver
00:11:03
si una cadena es igual a otra
00:11:05
lo que realmente quiero ver es si el contenido
00:11:07
del espacio grandote
00:11:09
es el contenido de este otro espacio grandote
00:11:11
y eso nunca
00:11:14
lo voy a hacer con este operador
00:11:15
con este operador comparo
00:11:17
directamente si esta cadena
00:11:19
perdón, si esto es igual a esto
00:11:21
y esto es esta dirección
00:11:23
y eso es esta dirección, con lo cual esto
00:11:25
es falso
00:11:27
¿vale?
00:11:29
¿cómo podemos hacer entonces
00:11:30
ver si una cadena es igual a otra?
00:11:34
ahora lo hacemos
00:11:36
por si tenemos que hacerlo en algún primer ejercicio
00:11:37
ahora ya sé que
00:11:40
me haréis la pregunta
00:11:42
si tú dices que eso es falso
00:11:43
pero lo hemos ejecutado ya
00:11:45
¿por qué?
00:11:48
claro, porque por la gestión
00:11:52
que hace, pero eso
00:11:53
de esa gestión debemos olvidarla
00:11:55
porque escapa de nuestro control
00:11:56
la gestión que hace
00:11:58
para una primera cantidad de string
00:12:00
java, entonces tú
00:12:02
te haces dos string
00:12:04
que los dos son
00:12:06
y los inicializas con el mismo valor
00:12:08
entonces él por ahorrar
00:12:10
memoria, al segundo le da
00:12:12
la misma dirección y lo hace que
00:12:14
apunte a este también, porque ha dicho
00:12:16
como les has dado el mismo valor
00:12:18
¿para qué te voy a dar otro grandote?
00:12:20
y hago
00:12:23
apuntar a este hola, ¿para qué?
00:12:24
entonces, por eso
00:12:27
de puñetera casualidad por esta gestión
00:12:28
en esta situación me ha salido true
00:12:31
pero si yo ahora cambiara ese 2 y la pusiera
00:12:33
adiós, ahora ya sí que no podría
00:12:37
economizar, a esta dirección le daría
00:12:40
otra
00:12:43
y luego lo volviera a cambiar a hola
00:12:44
pues ya a lo mejor ya no lo vuelve a cambiar aquí
00:12:48
y ya se queda apuntando a otra, entonces ya me saldría falso
00:12:51
¿vale? entonces en función
00:12:54
de la casuística concreta
00:12:57
de mi programa, puede dar
00:12:59
la puñetera casualidad de que él
00:13:01
para economizar, haya
00:13:03
gestionado, oye, si estás poniendo
00:13:05
hola también al grandote, pues tiro
00:13:07
este a la basura y hago que este apunte aquí
00:13:09
si luego me lo cambias
00:13:11
pues ya lo deshago
00:13:13
entonces de puñetera casualidad puede haber ocurrido
00:13:14
que las direcciones sean iguales
00:13:17
pero yo no debería contar nunca con ello
00:13:18
porque exige que tenga cierto control
00:13:20
de cómo funciona el buffer, que eso es hasta
00:13:23
el 24 horas string
00:13:24
entonces
00:13:25
desde ya
00:13:26
olvidémonos, aunque de puñetera
00:13:29
casualidad pueda funcionar a veces por esta gestión
00:13:32
olvidémonos de
00:13:34
comparar si una cadena
00:13:36
es igual a otra y un objeto
00:13:38
en general con el doble igual, nunca
00:13:40
nunca jamás
00:13:41
porque nos creemos que estamos haciendo la condición
00:13:43
de que esta sea igual a esta
00:13:46
y no
00:13:47
estamos haciendo que esta dirección
00:13:49
sea igual a esta y no es lo que queremos
00:13:52
ver si esta dirección es igual a esta
00:13:54
Lo que queremos es ver si este contenido es igual a este
00:13:55
Entonces, si necesitamos
00:13:58
Ver si un contenido es igual a otro
00:14:01
¿Cómo lo podemos hacer?
00:14:03
¿Lo podemos hacer? Venga, sí, lo podemos hacer
00:14:05
Eso
00:14:06
Vale
00:14:08
Ahora
00:14:15
Aunque lo anterior
00:14:17
Funcione
00:14:22
Aunque lo anterior
00:14:24
Funcione de casualidad
00:14:31
Y ese casualidad
00:14:35
No lo he usado bien
00:14:36
No es que sea de casualidad
00:14:38
Es por las razones que os he dicho
00:14:39
No es que la máquina virtual lo haga funcionarse de la gana y no
00:14:40
Aunque lo diga de casualidad
00:14:42
¿Eh?
00:14:46
Sí
00:14:48
Nunca debemos
00:14:49
Debemos
00:14:52
Nunca debemos
00:14:59
Comparar así cadenas
00:15:02
Así la igualdad
00:15:05
de string
00:15:09
porque nos arriesgamos
00:15:11
a que en la gran mayoría de los casos
00:15:14
el resultado sea erróneo
00:15:16
esto nunca jamás
00:15:17
¿cómo lo podemos hacer?
00:15:20
podemos
00:15:24
hacerlo
00:15:24
¿cómo lo hacemos?
00:15:26
bueno, pues podemos, si es que necesitamos
00:15:28
vale, como lo hemos dejado apuntado
00:15:30
lo decimos, aunque
00:15:36
por ejemplo, yo quiero la condición
00:15:38
de que nombre1 sea igual a
00:15:40
nombre2
00:15:42
y la quiero ya bien hecha, no así, quiero la condición
00:15:43
del espacio al que apunta nombre 1, quiero que sea
00:15:48
quiero que me diga si es igual que el espacio al que apunta nombre 2
00:15:51
pues lo tengo que hacer así, nombre 1
00:15:55
y como nombre 1 es un objeto
00:16:01
recordad que los objetos pueden llamar a funciones que hacen cosas
00:16:05
de hecho aquí ha llamado a len, pues también puede llamar
00:16:09
a una función que hace cosas
00:16:14
que es la función equals
00:16:16
que si tú le pasas
00:16:18
otro string
00:16:23
todo este código de aquí
00:16:24
es capaz de acceder al espacio gordote
00:16:26
acceder al espacio gordote
00:16:29
ver si son iguales
00:16:30
y si son iguales te devuelve true y si no false
00:16:31
esto ya sí que sí
00:16:34
esto ya sí que sí
00:16:37
si yo tengo nombre 1
00:16:40
que en realidad es una dirección de memoria
00:16:42
que me apunta al espacio gordote
00:16:45
que tiene el dato
00:16:46
tengo nombre 2
00:16:48
que en realidad es una dirección de memoria
00:16:50
que me apunta
00:16:54
a este que tiene el dato
00:16:55
pues nombre 1
00:16:57
punto equals nombre 2
00:17:01
ya es un código más largo que te hace
00:17:03
nombre 1
00:17:05
vete a su espacio gordote
00:17:06
este
00:17:08
nombre 2
00:17:09
vete al gordote
00:17:10
este
00:17:11
son iguales lo que hay aquí
00:17:11
es la misma cadena
00:17:13
Sí, es la misma, las dos son hola
00:17:15
Te devuelvo true
00:17:17
No es la misma, una es Pepito y otra es Juanito
00:17:18
Te devuelvo false
00:17:21
¿Vale?
00:17:22
Esto ya sí que sí podemos contar
00:17:24
Con que nos va a dar
00:17:26
Si una cadena de texto es igual a 1
00:17:28
Pero sin embargo esto otro
00:17:30
Nombre 1
00:17:33
Igual a nombre 2
00:17:35
Eso nunca
00:17:37
El doble igual solamente para
00:17:38
Comparar
00:17:42
Números y caraceres
00:17:44
¿Vale?
00:17:47
No objetos
00:17:50
¿Por qué te da true entonces?
00:17:50
Porque
00:18:02
Porque nombre 1 y nombre 2
00:18:03
A ver, en esta misma situación
00:18:08
Yo creo que os debería dar
00:18:09
Si es la misma
00:18:11
Os debería dar true a todos
00:18:12
Si es la misma
00:18:14
Porque en esta
00:18:15
¿Dónde estoy?
00:18:15
Aquí
00:18:17
Yo acabo de crear las variables
00:18:17
Esas variables todavía no vienen
00:18:19
de no, entonces
00:18:21
es su creación inicial
00:18:23
entonces cuando creo la segunda
00:18:25
me dice, uy ya tengo una que se llama Luis
00:18:27
pues que aproveche esa dirección
00:18:29
pero si esa variable viene de antes
00:18:31
ya tiene una dirección creada
00:18:33
para otro dato, entonces ya no aprovecha
00:18:35
el mismo, entonces en función de lo que haya pasado
00:18:37
antes
00:18:39
claro, porque ahí
00:18:40
claro, ahí viene el stream
00:18:46
de otro sitio, entonces
00:18:49
para la primero ha hecho una dirección
00:18:50
para la segunda he hecho otra
00:18:52
entonces por eso es a lo que voy
00:18:54
que en función de la situación
00:18:56
puede reutilizar la dirección
00:18:58
o puede no reutilizarla
00:19:01
entonces como se nos escapa del control
00:19:02
cada situación
00:19:04
jamás comparamos con doble igual y ya está
00:19:06
nunca, no lo vais a ver en ningún sitio
00:19:08
jamás, de hecho
00:19:10
prácticamente
00:19:12
nadie sabe
00:19:13
que la gestión de stream
00:19:16
para una primera cantidad de stream
00:19:18
la economiza de esta manera
00:19:20
prácticamente nadie lo sabe
00:19:22
porque es algo que no se pone de manifiesto nunca
00:19:26
nadie usa esto con doble igual y se encuentra
00:19:28
que le sale true
00:19:30
no es una curiosidad que casi
00:19:31
podríais olvidar desde ya
00:19:34
y quedaros con la pauta de que si verse una
00:19:35
cadena es igual
00:19:38
para ver si una cadena es igual que otra
00:19:39
siempre con igual
00:19:42
siempre
00:19:44
para ver si es distinto
00:19:44
tendrías que poner el no delante
00:19:49
Pero es que eso es el operador lógico
00:19:52
Que todavía no lo hemos visto
00:19:53
Es un operador lógico
00:19:54
Vale, entonces vamos a ver
00:19:58
Para callarme yo un rato
00:20:00
Y para ver si
00:20:01
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 2
- Fecha:
- 30 de septiembre de 2025 - 18:53
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 20′ 03″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 383.80 MBytes