tutorial traduccion google dallas dart

traduccion - dart vs javascript



¿Cuáles son las diferencias entre las diferentes implementaciones de mapas en Dart? (1)

Dart tiene un tipo de mapa, con implementaciones como HashMap, LinkedHashMap y SplayTreeMap. ¿Cuál es la diferencia entre esas diferentes implementaciones de mapas?


Dart tiene soporte incorporado para colecciones como Lista, Conjunto y Mapa. Dart tiene diferentes implementaciones de mapas. Comprender los pros y los contras entre implementaciones puede ayudarlo a tomar una decisión informada.

(Nota: esto está escrito alrededor del momento de Dart M3, por lo que lo que sigue puede no coincidir con los documentos en este momento).

¿Qué es un mapa?

Un mapa es un contenedor asociativo, que asigna claves a valores. Las claves son únicas y pueden apuntar a un solo valor. Una clave no puede ser nula, pero un valor puede ser nulo.

Mapa de literales

Dart soporta literales de mapas, como este:

var accounts = {''323525'': ''John Smith'', ''588982'': ''Alice Jones''};

La especificación dice que los literales de mapas deben mantener el orden de inserción. Esto significa que las accounts son una instancia de LinkedHashMap .

La especificación también dice que las claves literales del mapa deben ser cadenas. Esto podría ser cambiado en el futuro.

nuevo mapa ()

Dart admite constructores de fábrica, por lo que puede crear una nueva instancia de Map como esta:

var accounts = new Map();

La clase Map es abstracta, lo que significa que el constructor de fábrica crea realmente una instancia de una subclase de Map . Entonces, ¿cuál es el tipo real de accounts ?

Las versiones anteriores de Dart crearon una nueva instancia de HashMap partir del new Map() constructor new Map() . Sin embargo, Dart bug 5803 establece que para que {} y el new Map devuelvan el mismo tipo, el new Map pronto devolverá una instancia de LinkedHashMap .

LinkedHashMap (o, InsertionOrderedMap)

Un LinkedHashMap itera a través de claves y valores en el mismo orden en que se insertaron.

Nota: LinkedHashMap probablemente será renombrado a InsertionOrderedMap. Siga Dart bug 2349 para el progreso.

Aquí hay un ejemplo:

import ''dart:collection''; main() { var ordered = new LinkedHashMap(); ordered[''32352''] = ''Alice''; ordered[''95594''] = ''Bob''; for (var key in ordered.keys) { print(key); } // guaranteed to print 32352, then 95594 }

Aquí está el código fuente de LinkedHashMap . (Si este enlace deja de funcionar, es probable que se haya cambiado el nombre de la clase)

HashMap

Un HashMap no tiene garantía de mantener el orden de inserción. Cuando recorres las claves o los valores de un HashMap, no puedes esperar un cierto orden.

Un HashMap se implementa utilizando una tabla hash .

Aquí hay un ejemplo de cómo crear un nuevo HashMap:

import ''dart:collection''; main() { var accounts = new HashMap(); }

Si no le importa mantener el orden de inserción, use HashMap.

Aquí está el código fuente de HashMap .

SplayTreeMap

Un árbol de distribución es un árbol de búsqueda binaria con equilibrio automático, con la propiedad adicional a la que los elementos a los que se accedió recientemente son rápidos para acceder nuevamente. Realiza operaciones básicas como la inserción, búsqueda y eliminación en O (log (n)) tiempo amortizado.

import ''dart:collection''; main() { var accounts = new SplayTreeMap(); }

Un SplayTreeMap requiere que todas las claves sean del mismo tipo.

Un árbol de distribución es una buena opción para los datos que se almacenan y acceden con frecuencia, como los cachés. La razón es que usan rotaciones de árboles para traer un elemento a la raíz para accesos más frecuentes. El rendimiento proviene de la auto-optimización del árbol. Es decir, los elementos a los que se accede con frecuencia se mueven más cerca de la parte superior. Sin embargo, si se accede al árbol con la misma frecuencia, entonces no tiene sentido usar un mapa de árbol de distribución.

Un caso de ejemplo es un enrutador de módem que recibe paquetes de red a tasas muy altas. El módem tiene que decidir qué paquete va en qué cable. Puede usar una implementación de mapa donde la clave es la IP y el valor es el destino. Un mapa de árbol de distribución es una buena opción para este escenario, ya que la mayoría de las direcciones IP se usarán más de una vez y, por lo tanto, se pueden encontrar desde la raíz del árbol.