Algunas de las declaraciones aquí son confusas o incluso incorrectas, especialmente la idea de que inmutable. Vector en Scala es algo así como una ArrayList. List y Vector son estructuras de datos inmutables y persistentes (es decir, "baratas para obtener una copia modificada"). No existe una opción predeterminada razonable, ya que podría ser para estructuras de datos mutables, sino que depende de lo que esté haciendo su algoritmo. La lista es una lista enlazada individualmente, mientras que Vector es un número entero de base 32, es decir, es una especie de árbol de búsqueda con nodos de grado 32. Usando esta estructura, Vector puede proporcionar las operaciones más comunes razonablemente rápidas, es decir, en O (log_32 ( norte)). Eso funciona para anteponer, agregar, actualizar, acceso aleatorio, descomposición en cabeza / cola. La iteración en orden secuencial es lineal. La lista, por otro lado, solo proporciona iteración lineal y anteposición de tiempo constante, descomposición en cabeza / cola.
Esto podría parecer como si Vector fuera un buen reemplazo para List en casi todos los casos, pero anteponer, la descomposición y la iteración son a menudo las operaciones cruciales en secuencias en un programa funcional, y las constantes de estas operaciones son (mucho) más altas para el vector debido a su estructura más complicada. Hice algunas mediciones, por lo que la iteración es aproximadamente el doble de rápida para la lista, el antecedente es aproximadamente 100 veces más rápido en las listas, la descomposición en la cabeza / cola es aproximadamente 10 veces más rápida en las listas y la generación de un transitable es aproximadamente 2 veces más rápida para los vectores. (Esto probablemente se deba a que Vector puede asignar matrices de 32 elementos a la vez cuando lo construye usando un generador en lugar de agregar o agregar elementos uno por uno).
Entonces, ¿qué estructura de datos debemos usar? Básicamente, hay cuatro casos comunes:
- Solo necesitamos transformar secuencias por operaciones como mapa, filtro, plegado, etc.: básicamente no importa, debemos programar nuestro algoritmo genéricamente e incluso podríamos beneficiarnos de aceptar secuencias paralelas. Para operaciones secuenciales, la lista es probablemente un poco más rápida. Pero debe compararlo si tiene que optimizar.
- Necesitamos mucho acceso aleatorio y diferentes actualizaciones, por lo que debemos usar el vector, la lista será prohibitivamente lenta.
- Operamos en listas de una manera funcional clásica, construyéndolas precediendo e iterando por descomposición recursiva: use list, el vector será más lento en un factor 10-100 o más.
- Tenemos un algoritmo de rendimiento crítico que es básicamente imperativo y tiene mucho acceso aleatorio en una lista, algo así como una clasificación rápida en el lugar: use una estructura de datos imperativa, por ejemplo, ArrayBuffer, localmente y copie sus datos desde y hacia ella.
List<String> l = new ArrayList<String>()
blogs de escritura Scala para que creyera que todos usan List para obtener bondades persistentes de la colección, pero ¿Vector es lo suficientemente general como para que lo usemos en lugar de List?