← Flutter & Dart

Fundamentos de Dart

¿Cuál es la diferencia entre `List`, `Set` y `Map` en Dart y cuándo usar cada una?

Ver respuesta — intenta responderla en voz alta primero

List es una colección ordenada que permite duplicados (como un arreglo). Set es una colección sin orden garantizado que no permite duplicados. Map guarda pares clave-valor, donde cada clave es única. Eliges según necesites orden, unicidad o búsqueda por clave.

  • List: elementos en orden, accesibles por índice (lista[0]). Permite repetidos. Es la más común.
  • Set: un conjunto. No garantiza orden y descarta duplicados automáticamente. Perfecto cuando solo te importa "¿está o no está?" y quieres evitar repetidos.
  • Map: un diccionario. Cada valor se guarda bajo una clave única (mapa["nombre"]). Ideal para buscar datos rápido por una llave.

Un detalle de rendimiento: buscar si un elemento existe es rápido en Set y Map (usan hashing), pero en List hay que recorrerla.

void main() {
  // List: ordenada, permite duplicados
  List<int> numeros = [1, 2, 2, 3];
  numeros.add(4);
  print(numeros); // [1, 2, 2, 3, 4]
  print(numeros[0]); // 1 (acceso por índice)

  // Set: sin duplicados
  Set<int> unicos = {1, 2, 2, 3};
  print(unicos); // {1, 2, 3} (el 2 repetido se descarta)
  print(unicos.contains(2)); // true

  // Map: clave-valor
  Map<String, int> edades = {"Mike": 25, "Ana": 30};
  print(edades["Mike"]); // 25
  edades["Luis"] = 40; // agregar
  print(edades.keys); // (Mike, Ana, Luis)
  print(edades.values); // (25, 30, 40)

  // Truco: quitar duplicados de una lista pasando por un Set
  List<int> conRepetidos = [1, 1, 2, 3, 3];
  List<int> sinRepetidos = conRepetidos.toSet().toList();
  print(sinRepetidos); // [1, 2, 3]
}

Acceder a una clave que no existe en un Map y no manejar el null. edades["NoExiste"] devuelve null, no lanza error. Si esperabas un valor y no verificas, arrastras un null a donde no lo esperabas. Usa edades["clave"] ?? valorPorDefecto o containsKey.

"List es ordenada y permite duplicados, la uso para secuencias donde el orden importa. Set no permite duplicados y no garantiza orden, la uso cuando solo me interesa la unicidad o preguntar si un elemento existe. Map guarda pares clave-valor con claves únicas, ideal para buscar por llave. Un truco común es convertir una lista a Set y de vuelta a List para eliminar duplicados. Además, buscar en Set y Map es más rápido que en List porque usan hashing."

Reto rápido

¿Qué imprime este código?

var s = {1, 2, 3};
var m = {};
print(s.runtimeType);
print(m.runtimeType);
Ver respuesta

s es un Set (aproximadamente _Set<int>). Pero m con {} vacío es un Map, no un Set. En Dart, {} vacío por defecto es un Map. Si quieres un Set vacío tienes que escribir <int>{} o Set<int>(). Es una trampa clásica.