20250203 Estructuras dinámicas - 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:
Voy a grabar esta clase, por lo tanto si habláis me estáis autorizando a poder grabar vuestra voz
00:00:00
Entonces hoy la primera cosa que vamos a ver es un poco el concepto de estructuras dinámicas en general
00:00:08
Una estructura dinámica es una colección de datos que puede variar su tamaño en tiempo de ejecución
00:00:14
Ya lo hemos hablado varias veces de esto, hay dos tiempos, uno en tiempo de compilación y uno en tiempo de ejecución, más o menos
00:00:23
El tiempo de compilación es cuando tú estás programando, entonces vas a compilar tu código y te sale un fichero .class con dentro bytecode que luego la Java Virtual Machine interpretará porque se interpreta.
00:00:29
¿Vale? Os acordaos que Java es mitad compilado, mitad interpretado, principalmente interpretado por la Java Hector Machine.
00:00:45
Entonces, estos dos tiempos son distintos en el sentido que hay cosas que se pueden hacer cuando todavía el programa no se ha ejecutado,
00:00:55
pero hay otras cosas que no, que hasta que el programa no se ejecute no sé qué va a pasar.
00:01:03
¿Vale? Cuando yo leo un número por teclado, ¿vale? Y digo, vale, dame tu edad. Yo sé que va a leer un número, pero hasta que no lo ejecute, no sé si el usuario se va a equivocar y en vez de ponerme un número me pone gato. ¿Vale? En ese caso explotaría y no sé qué va a pasar porque todavía no hemos visto la gestión de excepciones.
00:01:08
aquí es un poquito lo mismo vale y nosotros conocemos los arrays vale los arrays son una
00:01:30
estructura que son una colección de datos sí o no ahora el tamaño de los arrays cuando se decide
00:01:38
normalmente el tiempo de compilación sí ahora podría hacer cosas un poquito distintas vale en
00:01:47
Yo podría pedirte un número, tú pones 7, y yo te hago un array de 7 posiciones.
00:02:00
Pues eso sería a tiempo de ejecución.
00:02:05
Pero todo lo que hago con el array, crearlo, cuando yo lo creo, le tendré que decir,
00:02:08
new array, no sé qué, y entre paréntesis le pongo un tamaño.
00:02:13
Ese es su tamaño, fijo.
00:02:17
Cuando yo le doy ese numerito de allí, la memoria, o sea, la digital machine,
00:02:20
irá a la memoria, pillará un trozo
00:02:25
de memoria y dirá, esto es mi array
00:02:28
y ese trozo, el tamaño de ese trozo
00:02:31
no lo va a cambiar en la vida, la única cosa que yo puedo hacer
00:02:34
para cambiar eso, es crear un nuevo array
00:02:37
¿si? por eso se dice
00:02:39
que es estático, una vez definido el array, una vez creado
00:02:43
pues así está, sin embargo
00:02:46
yo quiero crear estructuras que puedan
00:02:49
modificar su tamaño
00:02:51
mientras la estoy utilizando
00:02:53
o sea que si yo soy una escuela
00:02:56
y estoy dando de alta de alumnos
00:02:57
y ahora tengo 30 alumnos, pues ahora
00:02:59
puedo añadir otros 100 alumnos
00:03:01
y no pasa nada
00:03:03
es siempre la misma estructura que se va
00:03:04
haciendo más grande
00:03:07
está claro que luego por debajo, dependiendo de cómo
00:03:09
está hecha y de cómo está implementada
00:03:11
podría hacer cosas distintas
00:03:13
si nosotros la hemos implementado con un array
00:03:15
pues llegará un momento que el array
00:03:17
estará lleno y entonces
00:03:19
tendré que crear una red más grande
00:03:21
y volcar todo, etc
00:03:23
pero si por ejemplo pensáis a como
00:03:25
hemos implementado la linked list
00:03:27
pues la linked list no necesita
00:03:29
eso, añado más 100 usuarios
00:03:31
pues son 100 objetos nuevos que creo
00:03:33
enlazados entre ellos, ya está
00:03:35
entonces la diferencia
00:03:37
fundamental sería que una vez
00:03:43
definido el tamaño del array
00:03:45
esto no se puede modificar
00:03:47
en tiempo de jugación, se puede crear un nuevo array
00:03:48
pero no modificar el array que tenemos, mientras una estructura
00:03:51
dinámica permite modificar dinámicamente
00:03:53
el número de objetos que puede almacenar
00:03:55
hasta una
00:03:57
virtualmente
00:03:59
infinito, pero claramente
00:04:01
en informática no existe nada que sea
00:04:02
infinito, ¿vale? porque siempre tenemos
00:04:05
límites grandes de memoria
00:04:07
y cosas por el estilo, mientras que
00:04:09
tenga memoria puedo crear nuevos objetos
00:04:11
si creo demasiados objetos
00:04:13
pues llegará un momento en que mi ordenador no puede
00:04:15
Entonces, colapsará. Dentro de las estructuras dinámicas que podemos tener, hay varios tipos, ¿vale? Aquí estamos todavía, no hemos llegado a Java propiamente, ¿vale? Estos son más bien teoría genérica de las estructuras dinámicas. Luego pasaremos a Java y veremos Java, cosa que nos ofrece, ¿vale?
00:04:17
Dentro de las estructuras dinámicas en general, que luego tú puedes implementar en el lenguaje que tú quieras, están las listas, las colas, las pilas y los árboles.
00:04:43
¿Hay otros? Sí. Estas son las más básicas.
00:04:53
Listas. Una lista es una estructura dinámica que permite almacenar un objeto y tener un modo para poder acceder al siguiente elemento de la lista.
00:04:59
¿Cómo es este modo? No me interesa. Depende de cómo implemento la lista. En el linked list acceder al siguiente es con su campo siguiente. En el array list acceder al siguiente es cambiar el numerito del array.
00:05:08
pero dependiendo de cómo tú lo implementes
00:05:24
tendrás un modo para
00:05:27
sustancialmente recorrer esta lista
00:05:29
tendrás un inicio
00:05:31
tendrá una serie de objetos
00:05:33
que están enlazados de alguna
00:05:35
forma entre ellos, repito, como objetos
00:05:37
o porque están en un array o
00:05:39
por otro método que tú te inventes
00:05:41
en la lista el orden de los objetos
00:05:43
la escritura es importante
00:05:45
es una lista, cuando yo voy a meterlos
00:05:47
aquí hay un cierto
00:05:49
orden
00:05:51
que no necesariamente es el orden de inserción, pero sustancialmente, ¿por qué pensáis que es importante el orden en una lista?
00:05:53
¿Por qué el orden tiene algo que ver con la lista?
00:06:05
Porque la lista siempre inicia desde el inicio, inicia desde el objeto primero.
00:06:13
Entonces, si yo pongo un objeto al final de la lista, encontrarlo me costará siempre más que el primero de la lista, por ejemplo.
00:06:17
Entonces, dependiendo de lo que quiero hacer con estos objetos, pues puede ser que la lista no sea la mejor opción, o puede ser simplemente que en vez de ordinarlos con el orden de inserción,
00:06:27
o sea, el primero que inserto lo pongo primero, el segundo, segundo, tercero, tercero, pues a lo mejor me compensa crear otro tipo de orden, ¿vale?
00:06:40
Como por ejemplo, yo doy una prioridad a mis objetos y los objetos con prioridad más alta se pondrán antes de los objetos con prioridad más baja, ¿vale?
00:06:50
Una característica de la lista es que se pueden insertar nuevos objetos donde quiera, ¿vale?
00:07:04
normalmente nosotros por ejemplo hemos hecho que se añade al final una opción que se añaden o al
00:07:10
final o al principio vale pero en teoría la lista debería darme la posibilidad de decir
00:07:16
encércame esto en posición 3 esto me permite hacer listas ordenadas yo podría insertar un
00:07:22
nuevo objeto y esto por ejemplo como hemos dicho con un campo prioridad y él me lo va a poner
00:07:30
primero o último depende como quiero yo pero dejé entre que aquellos objetos que tengan la misma
00:07:35
prioridad entonces si yo inserto un prioridad 2 por ejemplo y esto tiene prioridad 1 será
00:07:43
seguramente después de esto esto tiene primero uno después después de esto esto ya tiene problema
00:07:49
prioridad 2 pues sólo inserto aquí o lo inserto después dependiendo de cómo quiero hacerlo pero
00:07:54
seguramente antes de todos aquellos que tienen prioridad 3.
00:08:00
¿Cómo implementaríais vosotros un concepto de prioridad?
00:08:04
¿Cómo podríamos hacer nosotros que insertamos un objeto y él elige dónde ponerlo?
00:08:11
¿Ese no es un string?
00:08:23
Pero si no sabemos qué objeto es, ¿por qué tiene un número?
00:08:32
¿Qué haríais vosotros para que yo pueda saber si este objeto va antes o después?
00:08:36
¿Eso no lo hemos visto?
00:08:55
Exacto, un método por ejemplo interesante podría ser la interfaz comparable
00:09:02
Como la interfaz comparable me permite comparar dos objetos y saber si es mayor o menor
00:09:06
Yo podría decir, defino dentro de mi lista los objetos, los defino con comparable
00:09:13
Entonces implemento el método compareTo
00:09:18
Y cuando voy a insertar un elemento
00:09:21
Para poderlo insertar lo voy a comparar con todos los elementos
00:09:24
Y digo, ¿es más grande o más pequeño que este de aquí?
00:09:28
Si este es más pequeño lo dejo primero
00:09:32
¿Este es más grande o más pequeño?
00:09:33
Este es más grande, pues entonces va aquí
00:09:35
Para que siempre me quede ordenada la lista
00:09:36
De menor a mayor o de mayor a menor
00:09:40
Dependiendo de cómo lo podáis hacer, ¿vale?
00:09:41
Al recorrer la lista lo haré desde el inicio hasta el final, ¿vale?
00:09:44
Esta es una cosa importante de las listas, que normalmente hay el punto de acceso inicial y desde aquí tendré un mecanismo, como hemos dicho, para mirar el siguiente, para mirar el siguiente, para mirar el siguiente.
00:09:48
Entonces, hay listas, hay implementaciones de listas que me permiten un poquito evitar esto.
00:10:01
Como por ejemplo, la lista implementada como array permite acceder donde te da la gana.
00:10:07
Yo puedo decir, acceder a la posición 7, y él accederá directamente a la posición 7 de la array, y entonces me evito de saltar uno por uno.
00:10:12
Pero, por ejemplo, la lista implementada como un linked list no me permite hacer esto.
00:10:20
Tengo que insertar en el primero, entrar en el primero, y luego ir al segundo, y del segundo al tercero, del tercero al cuarto, hasta llegar al 7.
00:10:24
Dudas.
00:10:32
Las colas son parecidas a las listas, pero tienen una política fifo.
00:10:36
First in, first out.
00:10:43
O sea, el primero que tú has insertado tiene que ser el primer objeto que tú quites, ¿vale?
00:10:44
Esta es una fila, es una cola del supermercado, es una cola de una ventanilla, una cosa de ese estilo, ¿vale?
00:10:54
El primero que llega será el primero que será atendido.
00:11:01
Si yo implemento una cola, sustancialmente podría implementarla con un array, podría implementarla con una linked list que hemos visto,
00:11:05
Pero cuando voy a hacer la GET y la ADD, la que añade un elemento y la que pilla un elemento, cuando hago ADD siempre lo añadiré al final de la cola y cuando hago el GET siempre pillaré el objeto más viejo según orden de inserción.
00:11:12
inserción. ¿Podría cambiar yo a hacer una cola especial, que es una cola de prioridad, por ejemplo,
00:11:31
en el que se ordenan, pero no se ordenan según el orden de inserción, sino se ordenan según un orden
00:11:38
distinto, un orden de prioridad, un orden alfabético, un orden de numerito de 1 a 10, qué sé yo, pues sí lo
00:11:46
puedo hacer. Serían colas especiales. Normalmente la cola, así cuando lo pienso en general, debería
00:11:52
ser que los primeros insertados son los primeros que se salen que salen de la cola si esto por
00:12:00
ejemplo se puede utilizar para si yo tengo un programa que tiene que procesar alumnos y hacer
00:12:06
algo con ellos ellos lo que tengo otro programita o algo por estilo que va añadiendo a la cola los
00:12:16
alumnos que tiene que hacer y de vez en cuando el programa va a mirar vale voy a procesar uno
00:12:21
de estos alumnos a ver cuál le toca le toca este de aquí que es el primero vale lo procesa y hace
00:12:26
lo que tenga en una cola siempre tengo una cabeza este de aquí normalmente es el primer elemento que
00:12:31
voy a sacar o sea el más viejo el primero que ha insertado entonces cuando yo inserto simplemente
00:12:41
la cabeza la mueva aquí cuando yo remuevo perdón cuando yo pillo este objeto y digo dame el objeto
00:12:47
esto se remueve, la cabeza se mueve al siguiente
00:12:53
objeto que se vuelve la cabeza de la cola
00:12:55
¿sí?
00:12:57
¿judas?
00:12:59
¿se entiende más o menos?
00:13:01
la pila
00:13:03
es al revés, por distinta
00:13:05
es LIFO
00:13:07
last in, first out
00:13:08
¿vale?
00:13:11
el último que he insertado
00:13:12
es el primero que quito
00:13:14
¿sí?
00:13:16
por ejemplo
00:13:19
las llamadas a métodos
00:13:20
dentro de la Java Virtual Machine
00:13:22
se implementan como una pila
00:13:25
porque tú tienes el método main
00:13:28
dentro del método main llamas el
00:13:29
añade alumno
00:13:32
dentro del añade alumno llamas el
00:13:33
cambianombre
00:13:35
el primero que acaba será
00:13:36
cambianombre, entonces cuando acabo
00:13:39
cambianombre vuelvo
00:13:41
no al primero
00:13:43
a main
00:13:45
pero vuelvo a
00:13:47
añade alumno
00:13:50
Entonces estoy haciendo como una cola, ¿vale? Una pila, perdón. La primera, la base de la pila sería el main, por encima de la pila pongo el agrega alumnos, por encima el llama nombre.
00:13:51
Cuando acaba llama nombre y quito llama nombre de esta pila de ejecución, pues lo que tengo por debajo sería agregar alumno.
00:14:04
Cuando acabo de agregar alumno vuelvo al main, ¿vale? Esto es como se hacen normalmente las llamadas de métodos en Java o en cualquier lenguaje de programación más o menos.
00:14:12
¿Habéis visto alguna vez el juego de la Torre de Hanoi?
00:14:21
Hanoi, no sois informáticos.
00:14:29
Torre de Hanoi.
00:14:36
¿Eh? ¿Este aquí? ¿Eh? ¿Sí? ¿Os suena?
00:14:39
¿Tocos aquí?
00:14:43
Vale, es que, sustancialmente, tenéis todos los anillos en un palo
00:14:48
y tenéis que volver a... tenéis que conseguir ponerlos aquí,
00:14:52
pero solo podéis mover el palo de arriba
00:14:55
o sea, el anillo de arriba
00:14:58
pues esto es una pseudopila
00:14:59
¿sí?
00:15:01
porque yo no puedo mover el de abajo
00:15:03
tengo que mover esto, que es el último
00:15:05
que he metido dentro
00:15:07
¿sí? bueno, esto es un programa
00:15:08
típico
00:15:13
de, o sea, programar
00:15:14
un programa que te hace todas las
00:15:17
monsas para mover esto aquí
00:15:19
es un programa típico
00:15:20
de la informática
00:15:22
sigo, entonces
00:15:24
Entonces, estos al fin y al cabo son todos parecidos a listas, son cosas que tú añades los objetos y los objetos se van, hay un punto de acceso y se van añadiendo uno tras otro y hay una forma para ir de uno a otro, ¿vale?
00:15:27
Pero, mientras una lista es simplemente una lista como la lista de la compra, la cola tiene esta particularidad de que no puedes pillar el que te da la gana,
00:15:41
Tienes que pillar solo el más viejo que has insertado o según tu política de ancianidad.
00:15:51
Y la pila, en vez, es que el último que has insertado es el primero que quitarás.
00:15:59
Finalmente está el concepto de árbol.
00:16:07
En informática hablamos de árbol cuando vemos un grafo acíclico parecido a este de aquí.
00:16:09
Un grafo son nodos conectados con conexiones aristas, creo que lo llamáis, entre ellos.
00:16:19
Cuando un árbol no tiene nunca ciclos, o sea, si yo conecto estos dos puntitos de aquí entre ellos,
00:16:28
pues entonces no sería un árbol.
00:16:37
Y tiene la característica de que normalmente un nodo tiene un solo progenitor y tiene cuantos hijos tiene.
00:16:39
entonces, si os fijáis
00:16:46
esto tiene un solo padre, madre
00:16:49
o lo que más os dé la gana
00:16:51
pero puede tener varios hijos
00:16:52
entonces
00:16:55
se crea un árbol porque esto es el
00:16:57
nodo raíz y estas son las
00:16:59
hojas, lo veis el árbol
00:17:01
al revés
00:17:03
nosotros lo hemos llamado nodo
00:17:04
si tú haces un árbol
00:17:21
con un solo hijo
00:17:23
o un solo padre, pues te viene una lista
00:17:25
al fin y al cabo, la ventaja de este
00:17:27
aquí es que un nodo puede tener varios
00:17:29
¿para qué sirven estos? pues hay algunos tipos
00:17:31
de problemas que si lo miramos como
00:17:35
árboles, esto mejora muchísimo
00:17:38
con respecto a si lo miramos como lista
00:17:41
la lista es lineal, el árbol es
00:17:44
una estructura que no es lineal, tiene varias
00:17:47
diramaciones, tiene más complejidad
00:17:50
en términos de figura, por ejemplo
00:17:53
un uso típico es para ordenar
00:17:55
Yo aquí tengo un objeto que vale no sé cuánto. El siguiente objeto que inserto, lo inserto como su hijo, pero lo inserto a la izquierda si su valor es menor y a la derecha si su valor es mayor.
00:17:58
De esta forma me va distribuyendo y buscar luego los objetos es más rápido, porque por ejemplo, imaginaos que esto sea 5.
00:18:13
Si yo estoy buscando el objeto 7, puedo descartar automáticamente todos estos, porque los que estarán allí serán a la izquierda del 5, entonces valdrán menos de 5.
00:18:22
Voy aquí, me encuentro 9, pues puedo descartarme todo lo que está a la derecha, porque esto será menor que el 5.
00:18:33
Esto se llama árbol binario de búsqueda
00:18:40
Y tiene la particularidad que solo puede tener dos hijos
00:18:44
O mayor o menor
00:18:51
O sea que esto no podría ser porque aquí tiene tres
00:18:51
Es para hacer un ejemplo de
00:18:54
Hay algunos problemas que si utilizado como árbol
00:18:57
Pues funciona mucho mejor que si hago una cosa lineal
00:19:00
si no
00:19:04
porque aquí estamos hablando de una estructura de datos
00:19:15
y estamos hablando de algoritmo de ordenación
00:19:19
y depende de cuál
00:19:22
la ventaja es que
00:19:23
si tú cuando vas a ordenar los datos
00:19:27
en vez de guardarlos en un array
00:19:31
y luego buscar en un array con el método que sea
00:19:33
lo guardas en un árbol de búsqueda binario
00:19:35
y esta tiene algunas características
00:19:38
pues llega a ver, luego la búsqueda es mucho mejor que buscar en un array, pero sí, o ordenarlo.
00:19:40
Claramente, si yo aquí me invento un método que digo cuando inserto uno tengo que mirar si es mayor
00:19:50
o menor que esto y ponerlo a la izquierda o a la derecha, insertar un nuevo nodo va a ser más complejo
00:19:58
que antes, antes era, oye, añádelo, ya está, ahora en vez de, no, pillo, voy a mirar el primo nodo, si
00:20:03
Si el primer nodo es mayor, entonces voy a mirar esto.
00:20:09
Si el primer nodo es mayor, voy a mirar esto.
00:20:11
Y voy a buscar dónde tiene que estar.
00:20:13
Entonces se complica, por ejemplo, la inserción a ventaja de que luego después la búsqueda es mucho mejor.
00:20:16
Pero es un ejemplo.
00:20:23
El árbol como estructura es esto, ¿vale?
00:20:25
Y luego se pueden hacer muchas cosas con ellos.
00:20:29
Cuando hablamos de árbol, el nodo hoja es un nodo que no tiene descendentes.
00:20:32
Un nodo interior es un nodo que no es hoja. Un nodo raíz es el primero que no tiene progenitores. El nivel de árbol es cuántas generaciones tiene el árbol. Por ejemplo, ¿qué nivel tiene este? Cuatro. Una, dos, tres y cuatro.
00:20:36
el grado de un nodo es
00:20:56
¿cuántos hijos tiene ese nodo?
00:21:03
¿qué grado tiene este nodo?
00:21:05
3
00:21:07
el grado de un árbol es el máximo
00:21:08
de los nodos de un árbol
00:21:12
entonces en este caso
00:21:14
¿qué grado tiene este árbol?
00:21:16
3
00:21:22
el máximo
00:21:22
el máximo de los nodos de un árbol
00:21:25
¿vale?
00:21:28
es el grado máximo
00:21:30
Este de aquí, como tiene un nodo con tres hijos, pues el grado es 3, porque entre todos sus nodos, él tiene 3, ¿vale?
00:21:31
Un árbol binario de búsqueda debería tener grado 2, ¿sí?
00:21:42
Porque no puede tener un nodo con más de dos hijos, ¿sí?
00:21:49
¿Dudas hasta aquí?
00:21:57
vale, entonces
00:21:58
ahora que tenemos un poquito la idea
00:22:00
de la tipo de colecciones
00:22:03
dinámicas, que se puede hacer
00:22:05
que cosas hay por allí, vamos a ver
00:22:06
Java que nos ofrece, vale
00:22:09
Java implementa una serie
00:22:10
de estructuras dinámicas que extienden
00:22:13
la interface collection
00:22:15
vale, o sea que el punto
00:22:16
más alto en realidad es uno por arriba, pero bueno
00:22:19
la idea de cuando me pongo con
00:22:20
estructuras dinámicas, tengo un
00:22:23
interfaz que se llama collection
00:22:24
que me define algunas herramientas, algunos métodos que tienen que implementar todas las colecciones que hay.
00:22:26
Si voy a mirar Collection, esta es una interfaz y lo que me dice es que cualquier interfaz que quiera hacer Collection
00:22:44
tiene que poder añadir un elemento, remover todos los elementos
00:22:53
de la conexión, buscar un objeto, o sea, decirme si este objeto
00:22:58
está o no en la colección, decirme, no lo sé, si está vacía
00:23:02
la colección, decirme si... quitar un elemento concreto,
00:23:08
decirme el tamaño de cuántos elementos hay, bla, bla, bla,
00:23:14
más otras cosillas. Entonces, cualquier collection
00:23:17
que yo creé en Java
00:23:21
tiene que haber implementado todos estos métodos de aquí
00:23:24
esto quiere decir que una cualquier collection
00:23:27
permite utilizar estos métodos
00:23:29
las colecciones representan un grupo de objetos
00:23:33
denominados elementos
00:23:37
podemos encontrar diversos tipos de colecciones
00:23:39
según si esos elementos están ordenados
00:23:42
si se permiten las repeticiones de los elementos, etc.
00:23:45
cada una de las collections que veremos ahora
00:23:48
son implementaciones que difieren
00:23:50
un poquito una de la otra, con características
00:23:52
un poquito distintas. Luego habrá más
00:23:55
de las que vemos nosotros, pero nosotros
00:23:57
veremos las principales.
00:23:59
Es el tipo más genérico en
00:24:01
cuanto a que se refiere
00:24:03
a cualquier tipo que contenga
00:24:04
un grupo de elementos. O sea, que esto es
00:24:06
no te dice
00:24:09
qué es, no te dice cómo funciona,
00:24:10
no te dice si es una lista, una
00:24:13
cola, un árbol, te dice si es una colección
00:24:14
de datos. Es
00:24:17
muy muy genérico. Luego, dependiendo de cómo lo
00:24:18
implementas tú tendrá una función u otra porque él te dice tú tienes que añadir y tienes que poder
00:24:20
quitar pero no te está diciendo cómo hacerlo si tú decides por ejemplo que añade siempre delante
00:24:28
y quita siempre del fondo estás haciendo una cola pero si en vez de estar hablando y haciendo lo
00:24:35
que no sé que escucharéis entonces si yo lo que hago es que la collection me dice tiene la de
00:24:49
tiene la remove, y yo digo que cuando hace la add la añade siempre al principio de
00:24:58
mi estructura y que cuando hago la remove quita siempre la última de la
00:25:02
estructura, lo que estoy haciendo es una cola, porque el primero que inserto al
00:25:06
principio y removo al final, entonces el del final será siempre el más viejo, si?
00:25:11
es una cola al revés, en cierto sentido, si? que se puede hacer si se inserta delante y
00:25:15
se quita al final en vez de insertar al final y sacar delante, siempre una cola
00:25:22
en esta interfaz encontramos una serie de métodos
00:25:27
que nos servirán para hacerlo
00:25:38
esta es la estructura general de todo lo que vamos a ver
00:25:39
a partir de ahora
00:25:45
aquí está collection
00:25:46
en realidad collection
00:25:49
extiende o hereda
00:25:51
da iterable
00:25:54
¿Sí? Entonces, lo que empieza toda esta estructura es iterable
00:25:57
Iterable es un concepto de algo, un conjunto de cosas sobre el que yo puedo ir a iterar
00:26:02
O sea, que yo puedo ir a mirar de uno en uno
00:26:12
¿Sí? Y a partir de este concepto de no sé qué es, pero sé que puedo ir a mirarlo de uno en uno
00:26:15
Me hago una colección. ¿Qué es una colección? Pues un conjunto de datos
00:26:22
No un conjunto, un grupo de datos
00:26:26
¿Vale? Un grupo de objetos
00:26:28
Sobre el que yo podré hacer
00:26:30
Una iteración
00:26:32
O sea, que tengo 10 objetos
00:26:34
Puedo pillar el primero, luego el segundo, luego el tercero
00:26:36
Luego el cuarto, hasta que los he mirado todos
00:26:38
¿Por qué? Porque cualquier collection
00:26:40
Es iterable
00:26:42
¿Se entiende?
00:26:43
Esto es una ventaja porque me da la posibilidad
00:26:47
De sustancialmente cualquier
00:26:49
Colección, tener un
00:26:51
Mecanismo para poder decir
00:26:53
Dame todos sus objetos
00:26:55
uno por uno, ahora
00:26:57
si será una cola me los dará ordenado
00:26:59
del primero al último, si es una pila me dará
00:27:01
last in, last out
00:27:03
last in, first out, si es
00:27:04
un árbol me lo dará de otra forma
00:27:07
como
00:27:09
se hace no me interesa
00:27:11
depende de la implementación
00:27:13
yo sé que se puede hacer
00:27:14
yo sé que hay un mecanismo para poder ir a
00:27:16
mirar uno por uno todos los
00:27:19
elementos
00:27:21
¿se entiende?
00:27:21
a partir de collection
00:27:25
se crean tres interfaces, que son list, queue y set.
00:27:26
Lista es una lista, queue es una cola, set es un conjunto.
00:27:35
La diferencia fundamental entre list, queue y set es que aquí se pueden repetir los datos,
00:27:42
o sea, yo puedo poner el mismo alumno diez veces, mientras aquí los datos son únicos.
00:27:49
Si yo he añadido un alumno concreto, no puedo añadir otra vez el mismo alumno o un alumno equivalente.
00:27:56
¿Cuándo dos alumnos son equivalentes?
00:28:06
¿Cuándo dos objetos son equivalentes?
00:28:15
Cuando el equals entre estos dos objetos es de true.
00:28:24
Luego tú, si no has definido el equals, será el igual igual, entonces serán iguales sólo cuando son el mismo objeto.
00:28:28
si en vez tú has sobre escrito el equal
00:28:35
si has dicho que tengan el mismo DNI
00:28:37
cuando dos objetos hasta distintos
00:28:39
dos instancias distintas tengan el mismo DNI
00:28:42
para ti serán lo mismo
00:28:45
entonces en una lista se pondrían una y otra vez
00:28:46
en un set se pondría una sola vez
00:28:49
cuando tú intentaras poner otra vez
00:28:51
el mismo alumno con el mismo DNI
00:28:54
te diría, no está
00:28:57
entonces en el set es muy importante
00:28:59
la definición del equal
00:29:02
lo volveremos a ver
00:29:04
entonces
00:29:07
la lista son las listas
00:29:09
la que hemos hablado ahora, la queue son las colas
00:29:11
los sets son los conjuntos, esta particularidad
00:29:13
de que es un conjunto que no se puede repetir
00:29:15
los elementos
00:29:17
también en lista queue
00:29:18
el orden tiene sentido
00:29:21
en un set no
00:29:23
el conjunto es
00:29:24
yo pongo ahí elementos
00:29:27
pero el orden con que los he metido
00:29:28
no me interesa
00:29:31
Él hará lo que quiere, lo reorganizará, no necesariamente se ha insertado antes esto y luego esto, cuando los voy a leer lo encuentro en esta orden. Él lo moverá como mejor le da para que sea lo más eficiente posible.
00:29:34
Si quiero y me interesa que el orden sea importante y que quiera respetarlo, no uso un set, uso un list.
00:29:50
dentro de list que hay
00:29:59
hay ArrayList
00:30:06
de que os suena ArrayList
00:30:08
de que podría ser un ArrayList
00:30:09
una lista cuya implementación
00:30:11
está hecha con
00:30:17
Arrays, o sea mi lista
00:30:18
lo que hemos hecho el miércoles
00:30:21
pues eso se llama ArrayList en Java
00:30:23
y luego está
00:30:25
LinkedList, que será LinkedList
00:30:28
lo del viernes
00:30:31
¿vale? o sea que lo que nosotros
00:30:34
hemos hecho, formada
00:30:37
simplificada, sin optimizar nada
00:30:38
y feo como poca cosa en este multiverso
00:30:40
alguien se ha metido a hacerlo
00:30:42
bonito, bien
00:30:45
hecho, seguro
00:30:47
y con
00:30:48
¿cómo se dice?
00:30:50
con algo de eficiencia
00:30:53
y me ha creado dos listas
00:30:54
que ya existen, o sea dos
00:30:56
clases que ya existen, fijaos que
00:30:58
los verdes son clases, yo puedo crear objetos
00:31:00
RList o crear objetos LinkedList
00:31:02
y heredarán
00:31:05
todo lo que puedan hacer la lista, todo lo que
00:31:06
puedan hacer las colecciones y todo lo que puedan hacer
00:31:09
los iterables y por lo tanto
00:31:11
los podré utilizar para guardar
00:31:13
allí objetos y hacer lo que me dé la gana
00:31:15
¿se entiende?
00:31:17
vale
00:31:20
¿qué más cosas hay? hay vector
00:31:20
¿vale? vector es
00:31:23
parecido a una lista
00:31:25
¿vale? la ventaja que tiene vector
00:31:26
es que está
00:31:29
sincronizado
00:31:30
¿Qué quiere decir?
00:31:32
Segundo de DAM
00:31:36
¿Vale?
00:31:37
Programación de servicios
00:31:39
Y procesos
00:31:41
Vosotros ahora estáis trabajando con un solo hilo
00:31:42
De ejecución, le dais a un play
00:31:45
Y se va
00:31:46
Todas las
00:31:47
¿Cómo se dice?
00:31:49
Los comandos de Java que habéis puesto, uno detrás de otro
00:31:52
Se acabó
00:31:54
En segundo de DAM
00:31:56
Se aprende a programar con procesos
00:31:58
Eso quiere decir que la misma
00:32:00
o con threads
00:32:01
¿vale? hilos
00:32:03
un mismo proceso cuando se arranca
00:32:04
en vez de tener un único hilo de ejecución
00:32:08
tiene varios hilos de ejecución
00:32:10
que trabajan a la vez
00:32:12
mientras uno está haciendo una cosa
00:32:13
otro está haciendo otra cosa, para que entendáis
00:32:15
el word
00:32:17
cuando tú tienes el word, ¿qué puedes hacer
00:32:19
con el word? escribir
00:32:22
pero mientras tú escribes, ¿qué te hace el word?
00:32:25
sí, por otra cosa
00:32:34
pero lo que hace en particular es que si tú
00:32:35
escribes sin acentos, ¿qué te hace? Te lo pones rojo. ¿Y quién lo está haciendo eso? Pues otra
00:32:38
tarea, ¿vale? Otro hilo. Tú tienes dos hilos a la vez, uno que está pendiente de ti, de lo que
00:32:46
escribes, y otro hilo que está pendiente de cuando tú has escrito una palabra, ir a buscar en un
00:32:52
diccionario si esta palabra está escrita bien y si está escrita mal, marcarla de rojo. Estas dos
00:32:57
cosas se hacen a la vez. Son dos tareas que se hacen a la vez. ¿Vale? Para hacer un ejemplo
00:33:02
de multitarea. Pues cuando hay multitarea, hay un problema serio en el escribir en la
00:33:08
misma variable. Porque si yo me meto a escribir en esta variable y mientras estoy escribiendo
00:33:17
en esta variable viene otro y empieza a escribir en la misma variable, llega un momento en
00:33:21
que este trozo de memoria tiene una parte escrita por mí y una parte escrita por el
00:33:26
otro. Entonces, lo que está escrito no es ni mi dato ni el dato del otro. Es una mezcla
00:33:30
de los dos. Y si a alguien se le ocurre en ese momento ir a leer, tiene lo que se llama
00:33:35
una race condition, una condición de carrera o una inconsistencia de memoria. Y por lo
00:33:41
tanto, no funciona. Pues vector tiene sistemas internos para poder evitar esto. Si alguien
00:33:49
toca un vector, otro
00:33:58
thread no lo puede tocar.
00:34:00
¿Sí?
00:34:03
A nosotros no nos
00:34:05
interesa para nada. En un futuro
00:34:06
podría interesarnos. ¿Cuál es
00:34:08
la desventaja del
00:34:10
vector? Es que es más lento.
00:34:12
Para hacer esta comprobación
00:34:15
de, oye, mira, alguien me está
00:34:16
utilizando, porque si alguien me está utilizando, nadie
00:34:18
más me puede utilizar, pues esa
00:34:20
comprobación lo ralentiza.
00:34:22
Entonces una relista es más rápido
00:34:24
con vector, pero en términos
00:34:26
de utilizo, una relista con vector
00:34:28
serían muy muy parecidos
00:34:30
cambian poco o nada
00:34:31
hasta el menos segundo de dam
00:34:33
ahora, de vector
00:34:35
puedo heredar
00:34:38
una clase, que es la clase
00:34:40
stack, que en inglés
00:34:42
quiere decir, no, eso es
00:34:44
heap, stack
00:34:48
es pila, tu stack es
00:34:52
pila
00:34:55
esta es la implementación de la pila
00:34:56
esta pila
00:35:00
esta pila pila duda vale luego está la interfaz que no es una lista es una interfaz aparte se
00:35:01
parece vale pero es un poquito distinta porque la lista yo puedo hacer como lo que me da la gana la
00:35:14
que en vez es una una cola vale de este es una lista este es una cola vale o sea la lista no
00:35:19
necesariamente puede insertar en el medio puede hacer un poquito de más de
00:35:29
caos la cola no la cola inserto por un lado y pillo por el otro vale entonces
00:35:33
cuando hago la que la implementación que tengo de que es priority que priority que
00:35:38
es una cola de prioridad es lo que decíamos antes yo tengo que definir
00:35:45
dentro de los objetos una cierta prioridad la definiré probablemente con
00:35:49
un comparable vale y una vez que yo sé cuál es la prioridad como se calcula la
00:35:55
prioridad de un objeto cuando lo inserto dentro de una prioridad y que se
00:36:00
insertará allá donde tiene que estar como como como prioridad entonces donde
00:36:04
sale la cola que lo que tienen mayor prioridad serán los primeros que salen
00:36:11
vale no es un exactamente un puesto en fest out
00:36:17
Pero es un first-in, first-out con prioridad.
00:36:21
Y luego está una versión de la Q que es la DEC.
00:36:24
Esta está Double Ended Q.
00:36:29
La coda con doble extremidades, finales, qué sé yo.
00:36:33
Que, sustancialmente, en esta de aquí, que está la ArrayDec,
00:36:39
que fijaos que hace una mezcla rara así,
00:36:42
pues esta de aquí, de la ArrayDec, permite,
00:36:46
es una cola en el que se puede insertar
00:36:48
o quitar desde los dos extremos
00:36:51
entonces la puedo ver como por aquí
00:36:53
o por aquí, a la vez
00:36:57
¿para qué sirve? eso ya no lo sé, pero existe
00:36:58
lado set
00:37:01
hemos dicho que un set tiene la característica
00:37:05
de que no se pueden repetir los elementos
00:37:07
allí dentro y el orden
00:37:08
se pierde aquí, el orden no
00:37:11
tiene mucho sentido, el orden de inserción
00:37:13
esto es
00:37:15
Y aquí hay dos posibles implementaciones que son LashSet y LinkedLashSet.
00:37:16
El LashSet es una de las estructuras dinámicas más rápidas que haya.
00:37:25
es una de las implementaciones más veloz
00:37:35
a la hora de insertar y quitar
00:37:40
y encontrar objetos dentro de la colección
00:37:43
entonces siempre que podamos
00:37:47
y que esto sea, pues H7 sería una buena solución
00:37:51
ahora luego hablaremos de ese
00:37:56
la link de H7 es parecida a esta
00:37:58
solo que por dentro utiliza
00:38:00
un sistema enlazado parecido a la linked list
00:38:02
y finalmente está el sorted set
00:38:06
que es como un set pero en el que cuando insertas las cosas
00:38:09
no van al azar sino que van ordenadas y tienes el
00:38:14
triset que es un poco parecido a lo que decíamos antes
00:38:18
o sea que es un árbol que pero cuando inserto las cosas los ordeno
00:38:22
poniéndolo en el subárbol derecho o izquierdo dependiendo de si es
00:38:25
mayor o menor en base a la comparación del objeto que estoy insertando con el
00:38:30
objeto nodo esto es presentación general vale luego ahora haremos ejemplitos y
00:38:35
problemas y cosas por el estilo para ver cómo se usan aquí vale entonces la
00:38:43
interfaz collection las operaciones más importante puede añadir puede decir el
00:38:47
tamaño puedo iterar sobre esta colección o sea ir a mirar de uno en uno puedo
00:38:51
saber si un objeto
00:38:56
existe y puedo quitar un
00:38:58
objeto. ¿Vale? Esto es lo que me permite
00:39:00
Collection, que grosso modo
00:39:02
si lo pensáis, es la lista que hemos
00:39:04
hecho nosotros. La interfaz que hicimos nosotros
00:39:06
era esta.
00:39:08
¿Sí? Interfaz que desciende de Collection
00:39:10
está Set, que serían los conjuntos.
00:39:14
Los conjuntos son grupos de elementos en
00:39:16
los que no se admiten elementos
00:39:18
repetidos. ¿Vale? Para saber si
00:39:20
un elemento es repetido, se usa
00:39:22
Equals y HashCode.
00:39:24
¿Vale? Estos dos señores
00:39:26
me permiten saber si dos son iguales o si dos caen en el mismo hash.
00:39:28
¿Qué es un hash?
00:39:34
Paint.
00:39:36
¿Vale?
00:39:38
El hash es una función que me pilla un número infinito de x
00:39:38
y me lo mapea en un número finito de valores y.
00:39:49
Es una categorización.
00:40:00
¿Vale?
00:40:04
Por ejemplo, yo podría decir, hacer una función que me pilla un número y me dice si es par o impar.
00:40:04
Esta es una función ash, porque pilla un cualquier número, entonces tengo infinitos números,
00:40:16
y me lo maspea en dos categorías, o es par o es impar.
00:40:25
Si esto lo llamo 0 y esto lo llamo 1
00:40:30
Por ejemplo
00:40:36
Pues yo tengo una función que me da
00:40:37
Cualquier número, infinitos números
00:40:39
Me lo mapea o en la categoría 0
00:40:42
O en la categoría 1
00:40:44
¿Se entiende?
00:40:45
Podría hacer otra función
00:40:49
Que pilla esto
00:40:51
Y me lo pone en 8 posibles categorías
00:40:54
Entonces yo te doy el 37
00:40:58
El hace magia
00:41:03
Y me saca que es la categoría 3
00:41:04
Vale, perfecto, el 37 va aquí
00:41:07
El 37 va en esta categoría
00:41:09
Ahora te doy el 42
00:41:10
Hace magia, el 42 va aquí
00:41:12
Ahora te doy el 96
00:41:15
Y resulta que el 96 después de haber hecho magia
00:41:18
Pues va aquí también
00:41:21
Porque claro
00:41:22
Puede haber distintos números
00:41:24
Que caigan en la misma categoría
00:41:27
Porque el número de categoría es infinito
00:41:28
El número es infinito
00:41:30
Entonces esto pasará seguramente
00:41:32
¿Se entiende?
00:41:34
se entiende que es una función hash
00:41:37
entonces, ¿para qué me sirve?
00:41:39
así, a grandes rasgos
00:41:46
tampoco me quiero meter
00:41:48
porque aquí tengo un número
00:41:49
infinito de posibles objetos
00:41:52
y yo quiero
00:41:53
crearme una estructura en la que
00:41:57
tenga, por ejemplo, son pocas
00:41:59
pero, cuatro posibles categorías
00:42:02
y luego a partir de aquí
00:42:04
hago una cola
00:42:05
de estas cuatro categorías
00:42:07
¿sí?
00:42:09
Entonces, cuando tú pillas el primer número, el primer número cae en esta categoría, lo pongo aquí, A.
00:42:10
Tú pillas el segundo número, el segundo número cae en esta categoría aquí, lo pongo aquí, B.
00:42:17
El tercer número cae también aquí, pues lo pongo aquí, C.
00:42:24
El cuarto cae aquí, D.
00:42:30
El quinto aquí, E.
00:42:33
El sexto aquí, F.
00:42:35
El sexto aquí, F, G.
00:42:37
Veis que yo, ¿cuántos números he insertado?
00:42:39
¿Cuántos he insertado?
00:42:42
Dos, cuatro, seis, siete cosas
00:42:42
Si ahora los voy a buscar
00:42:44
¿Cuántas operaciones máximo tardo?
00:42:46
Si ahora busco F
00:42:56
¿Cuántas operaciones tardo?
00:42:57
Dos
00:43:05
Porque yo diría F cae en esta categoría
00:43:05
Y ya puedo excluir todas las otras categorías
00:43:08
Y entonces entraría aquí y lo compro
00:43:11
¿Es esto o no?
00:43:14
¿Es esto sí?
00:43:15
He insertado siete objetos
00:43:19
en una lista normal. Tendría a, b, c, d, f, g, y para encontrar f debería comprobar
00:43:20
es esto, no es esto, no es esto, no es esto, no es esto, no es esto, sí. Sin embargo,
00:43:33
ahora en dos pasos lo he hecho. Si la función h está bien hecha, mejora un mogollón este
00:43:38
tipo de problemas? Si la función h está hecha mal, pues entonces no. ¿Cuándo una
00:43:48
función h está mal hecha? No. Cuando todas, todos los números o la mayoría de los números
00:43:55
caen en una misma categoría. Función h, si el número es cero va en la categoría
00:44:11
uno, si hay otro número, va en la categoría dos. Es una función hash. Sí, está categorizando
00:44:19
números infinitos en dos categorías solas. Solo que todos los números van en la categoría
00:44:26
dos, excepto el cero que va en la categoría uno. Es pésima como función hash. ¿Sí?
00:44:31
Otro ejemplo de función hash. Pongamos que yo tengo un strings, ¿vale? Tengo un conjunto
00:44:39
de strings que me dan palabras
00:44:54
y cosas por el estilo, y yo quiero estas palabras
00:44:55
guardarlas y luego en un futuro
00:44:57
ir a buscarlas
00:44:59
y las quiero buscar de una forma eficiente
00:45:02
lo que podría hacer por ejemplo es
00:45:04
crearme, no sé cuántas son
00:45:05
21, 21 categorías
00:45:09
¿cuántas letras tenéis en vuestro
00:45:11
alfabeto?
00:45:15
¿eh? 27
00:45:17
23
00:45:20
que italiano es 21
00:45:21
25
00:45:23
Bueno, me creo una categoría por cada letra, más una categoría comodín para todos los demás, por si algo no es una letra.
00:45:25
Y ahora, cuando pillo una string, miro la primera letra de esta string y la pongo en su categoría en base a la primera letra.
00:45:35
Si empieza por A, la pongo en esta. Si empieza por B, la pongo en esta. Si empieza por C, la pongo en esta.
00:45:42
Y si no empieza por ninguna letra del alfabeto, la pongo en la última.
00:45:47
Entonces, si me llegan muchas palabras, las voy separando en estas categorías aquí.
00:45:54
Y luego, cuando voy a buscar, solo tendré que buscar entre las palabras que empiezan con la misma letra.
00:45:59
Todas las otras las puedo descartar.
00:46:05
¿Se entiende?
00:46:09
¿Entiende la idea que está la base del hash, del función hash?
00:46:11
Ahora, hacer una función hash hecha bien es complejo.
00:46:15
Es tarea de matemáticos.
00:46:22
¿Cuántos matemáticos hay aquí?
00:46:25
Bueno, a lo mejor alguien hay.
00:46:28
Pero como nosotros no sabemos hacerla, nosotros la hacemos con botón derecho, créame el hash.
00:46:32
Yo tengo que saber cuándo la tengo que hacer, pero cuando la tengo que hacer, que me la haga él.
00:46:40
¿Se entiende?
00:46:47
Entonces, en un conjunto, cuando voy a comparar, como no puedo repetir los elementos,
00:46:49
vale, el equals y el hashcode me sirven para comprobar si son iguales, vale, tened en cuenta que dos elementos iguales tienen que tener el mismo hashcode, pero puede ser que elementos distintos tengan el mismo hashcode, si,
00:46:56
los números pares
00:47:18
el 4 y el 8
00:47:21
tienen el mismo hashcode
00:47:23
pero no son iguales
00:47:24
pero normalmente está
00:47:27
esto set o las set
00:47:28
lo que hace es comprobar antes
00:47:30
el hashcode que es más fácil normalmente
00:47:32
si el hashcode es
00:47:35
correcto, es el mismo
00:47:36
va a comprobar que efectivamente
00:47:39
sean iguales, si el hashcode ya es
00:47:40
distinto pues ya fuera
00:47:43
esto implica que cuando yo como
00:47:44
programador implemento equals
00:47:46
y hashcode, tengo que hacer que respeten
00:47:48
estas cosas, o sea que
00:47:51
dos que tengan el mismo equals
00:47:52
tienen que tener el mismo hashcode
00:47:54
por eso se lo hago hacer
00:47:56
al eclipse
00:48:00
las listas, este tipo de
00:48:01
colecciones se refiere a las listas
00:48:04
en las que los elementos de la conexión tienen un
00:48:06
orden, existe una
00:48:08
secuencia de elementos, en ella
00:48:10
cada elemento estará en una determinada posición
00:48:12
índice de la lista
00:48:14
Entonces en las listas tienen un orden
00:48:15
Este es el primero, el segundo, el tercer elemento
00:48:19
Cuarto elemento, y yo le puedo decir
00:48:21
Píllame el séptimo elemento
00:48:22
Sea como array o sea como
00:48:24
Lista enlazada
00:48:27
Y la Q, la cola
00:48:28
Este tipo de colección
00:48:31
Esta diferencia es una lista de elementos
00:48:33
Que sigue el patrón
00:48:35
First in, first out, o sea, parecida a una lista
00:48:37
Pero que yo
00:48:39
No puedo pillar lo que me da la gana e insertar donde me da la gana
00:48:40
¿Vale? Tengo que seguir
00:48:43
el FIFO
00:48:45
la interfaz list
00:48:46
os recuerdo que hereda
00:48:49
de collection, entonces hace todo lo que tiene
00:48:51
que hacer collection, pero añade algunas
00:48:53
cosillas, permite
00:48:55
elementos duplicados
00:48:57
y aparte de lo que hereda
00:48:59
de collection, puede manipular el elemento
00:49:01
en función de su posición de la lista, le puedo
00:49:03
decir, píllame el tercer elemento
00:49:05
o ponme esto en el cuarto sitio
00:49:07
¿vale?
00:49:09
búsqueda de elemento, puede buscar
00:49:11
un elemento concreto en la lista y devuelve
00:49:13
su posición
00:49:15
búscame este señor
00:49:15
y si lo encuentras te dice
00:49:19
está en posición 7, y ahora tú puedes ir
00:49:21
a la posición 7 y pillarlo si quieres
00:49:23
o remover la posición 7
00:49:24
o hacer lo que quieras con la posición 7
00:49:27
iterar sobre el elemento
00:49:29
la lista
00:49:31
permite mejorar un poco el iterador
00:49:33
de collection, o sea, collection
00:49:35
tiene un iterador genérico
00:49:37
este de aquí permite hacer el iterador
00:49:39
propio de lista
00:49:41
el rango de operaciones
00:49:42
vale, permite hacer ciertas operaciones
00:49:44
sobre bloques
00:49:46
en plan, en vez de añádeme esto
00:49:48
y ahora añádeme esto, ahora añádeme esto
00:49:50
te puede decir, añádeme toda esta colección
00:49:52
te paso una colección y me la
00:49:55
añades a mi lista
00:49:56
pero bueno
00:49:57
aquí hay ArrayList, LinkedList
00:49:59
y una comparativa entre ArrayList
00:50:05
y LinkedList, lo dejamos
00:50:06
por ahora aquí, al nivel de
00:50:08
teoría, porque si no es
00:50:10
mucho, lo que vamos a hacer
00:50:12
es un ejemplo usando estas
00:50:14
cosas de aquí y mañana
00:50:16
lo retomamos y vemos la
00:50:18
diferencia y cosas por el estilo y seguimos un poquito
00:50:20
¿vale?
00:50:22
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 17
- Fecha:
- 3 de febrero de 2025 - 14:32
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 50′ 28″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 118.52 MBytes