CLASE 2.2 - Herencia en Colas - Pilas y Java List-2
CLASE 2.2 - Herencia en Colas - Pilas y Java List-2
CLASE 2.2 - Herencia en Colas - Pilas y Java List-2
Un tipo de dato abstracto (TDA) (en inglés, ADT por Abstract Data Type)
es un tipo definido solamente en términos de sus operaciones y de las
restricciones que valen entre las operaciones.
Qué es ArrayList?
Es una clase, que incluye la API de Java
que implementa una lista con un arreglo de
tamaño variable.
Está dentro del paquete java.util y
pertenece al framework de colecciones.
Un objeto Collection es un objeto Java que agrupa otros objetos. El framework de colecciones de
Java contiene un conjunto de estructuras de datos y algoritmos para representar y manipular
colecciones. Si se aplican correctamente, las estructuras de datos proporcionadas ayudan a
reducir el esfuerzo de programación y aumentar el rendimiento.
Arbol
• Almacenamiento de valores
en orden ascendente.
• Búsqueda eficiente.
Tabla de hash
Guarda asociaciones (clave, valor).
Es muy rápido, accede por clave
Requiere memoria adicional para
guardar las claves (tabla).
Tecnologías de almacenamiento
TAD
Tabla de Hashing Arreglos tamaño variable Árbol Lista Enlazada
En Java existe un paquete llamado java.util que provee varias implementaciones de listas,
las principales son ArrayList y LinkedList.
Estas listas permiten almacenar datos en memoria de forma similar a los arrays pero de forma
dinámica, es decir, que no es necesario declarar su tamaño, ni este último es fijo tal como pasa con
los arreglos.
Programación III - 2024
Colecciones en JAVA
Las clases LinkedList y ArrayList
El framework de colecciones tienes muchas implementaciones de estructuras de datos pero solo
usaremos dos de ellas LinkedList y ArrayList:
package java.util; package java.util;
Implementación de una lista con nodos enlazados Implementación de una lista con arreglos
Programación III - 2024
Colecciones en JAVA
Las clases LinkedList y ArrayList
Veamos un ejemplo de uso de las listas de la plataforma Java.
public class TestVinos {
Se pueden guardar
public static void main(String[] args) {
objetos de cualquier tipo
List lista_vinos = new LinkedList();
lista_vinos.add(new Vino("Mendoza", "Claroscuro", 2022));
lista_vinos.add(new Vino("Mendoza", "Gran Matilda", 2018));
lista_vinos.add(3);
lista_vinos.add("Bodega Azul - 2017");
while (!lista_vinos.isEmpty()) {
Object vino_actual = lista_vinos.get(0);
System.out.println("Catando: "+ vino_actual);
lista_vinos.remove(0);
}
}
}
Para resolver los problemas planteados aparecieron los Tipos de datos Genéricos
● JAVA permite definir clases y métodos genéricos.
● Las clases y métodos genéricos difieren de los "regulares" porque contienen tipos de
datos como parámetros formales.
● Los tipos genéricos nos permiten generalizar la implementación de las estructuras de
datos.
Una clase genérica significa que los elementos en esa clase se pueden generalizar con el
parámetro (ejemplo T) para especificar que podemos crear instancias con cualquier tipo como
parámetro en lugar de T como: Integer, Character, String o cualquier tipo.
Los genéricos también proporcionan seguridad de tipos en tiempo de compilación que permite
a los programadores detectar tipos no válidos en tiempo de compilación.
Todas las clases del framework de colecciones son Tipos Genéricos, lo que significa que al
instanciarlos podemos pasarle el "tipo" de los elementos que deseamos que contengan.
public class TestVinos {
public class TestVinos { public static void main(String[] args) {
public static void main(String[] args) { List<Vino> lista_vinos= new ArrayList();
List lista_vinos = new ArrayList(); lista_vinos.add(new Vino("Claroscuro", 2022));
lista_vinos.add(new Vino("Claroscuro", 2022)); lista_vinos.add(new Vino("Gran Matilda",2018));
lista_vinos.add(new Vino("Gran Matilda",2018)); lista_vinos.add(new Vino("Catena", 2015));
lista_vinos.add(3); int i=1;Vino vino_actual=null;
lista_vinos.add("Alma Negra La Azul - 2017");
while (!lista_vinos.isEmpty()) {
vino_actual = lista_vinos.get(0);
error lista_vinos.get(0).getCosecha(); //es Object
Vivo vino=(Vino)lista_vinos.get(0).getCosecha(); System.out.println("Paso "+ i++ +": "
error Vino vino=(Vino)lista_vinos.get(3).getCosecha(); + vino_actual.getNombre() +"-"
} + vino_actual.getCosecha());
} lista_vinos.remove(0);
}
No especificando un tipo }
● No especificando tipo, se guardan como Object. }
● Object no soporta los métodos de String, ni de Vino, ni de
ningún subtipo. Especificando Vino como tipo
● Se debe saber que tipo se guarda en cada posición o ● Hay chequeo de tipo en compilación: solo se permite agregar
utilizar el operador InstanceOf antes de castear. objetos de tipo Vino (o subclases).
● No es necesario castear para invocar sus métodos
Programación III - 2024
Colecciones en JAVA
Implementación de Stack
package tp1; @Override
import java.util.*; public int size() {
return data.size();
public class Stack<T> extends Sequence<T> { }
private List<T> data;
@Override
public Stack() { public boolean isEmpty() {
data = new ArrayList<T>(); return data.size()==0;
} }
Los elementos se almacenan en un arreglo dinámico. Los elementos se almacenan en una lista doblemente enlazada.
Permite el acceso aleatorio ya que los arreglos se basan Eso significa que acceder a cualquier elemento siempre lleva un tiempo lineal
en índices. Eso significa que acceder a cualquier elemento O(n).
siempre lleva un tiempo constante O(1).
Verificar si existe un elemento específico en la lista Verificar si existe un elemento específico en la lista dada se ejecuta en
dada se ejecuta en tiempo lineal O(n). tiempo lineal O(n).
Agregar/Borrar elementos en/de un índice específico, Agregar/Borrar elementos en/de en un lugar específico, en el peor de
en el peor de los casos, es de O(n). los casos, es de O(n). Suele ser más rápida porque nunca se necesita
cambiar el tamaño de la estructura.
Esta clase es más útil cuando la aplicación requiere Esta clase es más útil cuando se conoce que la aplicación requiere
acceso a datos y su tamaño no varía demasiado. manipulación de datos (muchas inserciones y borrados).
Los principales beneficios de ArrayList y LinkedList es que LinkedList tiene un O(1) para operaciones de
agregar y eliminar al principio y al final de la lista, mientras que ArrayList tiene O(1) para acceder a elementos
por su índice.
Una LinkedList consume un poco más de memoria que una ArrayList ya que cada nodo almacena dos
referencias al elemento anterior y al siguiente.
1. Crear, mediante su constructor, un nuevo ArrayList pasando la lista original como argumento al constructor.
2. Crear un nuevo ArrayList y agregar todos los elementos del original usando el método addAll().