
Dentro de las estructuras de datos en Java, los arrays o arreglos son de las más usadas. Sin embargo tienen algunas desventajas:
- Capacidad de almacenamiento fija y no modificable dinámicamente.
- Se terminan usando arrays demasiado grandes, no optimizados, haciendo mal uso de la memoria.
- No manejan datos de forma dinámica por tanto hacer inserciones que no sean al final es complicado ya que requiere desplazar elementos.
A continuación veremos estructuras de datos avanzadas que solucionan estos y otros problemas de forma eficiente.
Listas enlazadas
Este tipo de estructuras utilizan punteros o apuntadores, son una variable en memoria que lo que almacena es una referencia a otra dirección de memoria. Esto aporta el dinamismo del que carecen los arrays. El valor de un puntero puede ser null, es decir, que no apunta a ninguna dirección de memoria.
Lista enlazada simple
Cada elemento de la lista enlazada se llama nodo y tiene su propio bloque de memoria. La implementación de la lista enlazada conecta los nodos mediante punteros, todos los nodos son equivalentes y sus atributos mantienen enlazada la cadena. Los nodos incluyen además el contenido para almacenar la lógica de negocio y un atributo que apunta al siguiente nodo.

El código básico que nos permite implementar cualquier tipo de pila es la clase Nodo:
class Nodo {
Object informacion;
Nodo siguiente;
}
El propio API de Java también proporciona listas enlazadas a través del objeto LinkedList.
Pila
La pila es una estructura LIFO: Last In First Out, el último elemento que se inserta en la pila es el primero que sale. Ejemplo de lista enlazada implementada en Java como Pila:
public class EstructuraPila {
class Nodo {
int informacion;
Nodo siguiente;
}
private Nodo inicial;
public EstructuraPila () {
inicial=null;
}
public void insertar(int nuevoElemento) {
Nodo nuevoNodo;
nuevoNodo= new Nodo();
nuevoNodo.informacion = nuevoElemento;
if (inicial==null)
{
nuevoNodo.siguiente = null;
inicial = nuevoNodo;
}
else
{
nuevoNodo.siguiente = inicial;
inicial= nuevoNodo;
}
}
public int extraer ()
{
if (inicial!=null)
{
int informacion = inicial.informacion;
inicial= raiz.sig;
return informacion;
}
else
{
return Integer.MAX_VALUE;
}
}
public void imprimir() {
Nodo actual=inicial;
System.out.println("Listado de los elementos de la pila.");
while (actual!=null) {
System.out.print(actual.informacion+"-");
actual=actual.siguiente;
}
System.out.println();
}
public static void main(String[] ar) {
EstructuraPila pila=new EstructuraPila();
pila.insertar(12);
pila.insertar(39);
pila.insertar(1);
pila.imprimir();
System.out.println("Extracción de los elementos:"+pila.extraer());
pila.imprimir();
}
}
Cola
La cola es una estructura FIFO: First In First Out, el primer elemento que se inserta en la cola es el primero que sale.
Árboles
Son estructuras de datos no lineales que representan información jerarquizada. Algunas de sus aplicaciones más típicas en computación: estructurar las tablas de símbolos en los compiladores, asignación de bloques de memoria de tamaño variable o probar teoremas.
Ejemplo nodo árbol en Java
public class Nodo<V> {
private V valor;
private Nodo<V> izquierda;
private Nodo<V> derecha;
public Nodo(V valor, Nodo<V> izquierda, Nodo<V> derecha) {
super();
this.valor= valor;
this.izq = izquierda;
this.der = derecha;
}
public V getValor() {
return valor;
}
public void setValor(V valor) {
this.valor = valor;
}
public Nodo<V> getIzquierda() {
return izquierda;
}
public void setIzquierda(Nodo<V> izquierda) {
this.izquierda= izquierda;
}
public Nodo<V> getDerecha() {
return derecha;
}
public void setDerecha(Nodo<V> derecha) {
this.derecha= derecha;
}
}
Al igual que en las listas enlazadas, en el propio API de Java ya existen numerosas implementaciones de árboles como en la clase BinaryTree.
Fundamentos de Java
| Asunto | Descripción |
| Tutorial básico y sintaxis | Tutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje. |
| Hilos (Threads) | Aprende a manejar hilos y las cuestiones básicas de la concurrencia |
| Funciones Lambda | Aquí te enseñamos las nociones más importantes para arrancas con funciones lambda |
| Palíndromos | Programa de ejemplo para el uso de palíndromos en Java. |
| Máquina Virtual de Java | Te explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM) |
| JDK, JRE y JVM | Diferencias entre el JDK, JRE y JVM. |
| Mejores libros Java en Español | Hazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas |
| TensorFlow | Manejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución |
| Tutorial Log4j | Tutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java |
| Java Security | Entiende y aplica las posibilidades que da Java para mantener la seguridad |
| Tutorial JConsole | Aprende los conceptos básicos de monitorización de procesos Java con JConsole |
| JavaFX | Tutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web. |
| Estructuras de datos en Java | Explicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol. |
| Javaapi | Conjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar |
| Algoritmo Huffman | Método eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes |