¿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.
"
Listes ordenada y permite duplicados, la uso para secuencias donde el orden importa.Setno permite duplicados y no garantiza orden, la uso cuando solo me interesa la unicidad o preguntar si un elemento existe.Mapguarda pares clave-valor con claves únicas, ideal para buscar por llave. Un truco común es convertir una lista aSety de vuelta aListpara eliminar duplicados. Además, buscar enSetyMapes más rápido que enListporque usan hashing."
¿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.