Una pequeña explicación sobre cómo funcionan.
ListBuffer
utiliza internamente Nil
y ::
para construir un inmutable List
y permite la eliminación constante de tiempo de la primera y la última elementos. Para hacerlo, mantiene un puntero en el primer y último elemento de la lista, y está permitido cambiar la cabeza y la cola de la clase ::
(de lo contrario inmutable) (buen truco permitido por los miembros private[scala] var
de ::
). Su método toList
devuelve la normalidad inmutable List
en tiempo constante también, ya que puede devolver directamente la estructura mantenida internamente. También es el generador predeterminado para List
s inmutables (y, por lo tanto, se puede esperar razonablemente que tenga un anexo de tiempo constante). Si llama al toList
y vuelve a agregar un elemento al búfer, lleva tiempo lineal con respecto al número actual de elementos en el búfer para recrear una nueva estructura, ya que no debe mutar la lista exportada.
MutableList
trabaja internamente con LinkedList
lugar, un (abiertamente, no como ::
) mutable aplicación lista enlazada, que sabe de su elemento y sucesor (como ::
). MutableList
también conserva los punteros al primer y último elemento, pero toList
regresa en tiempo lineal, ya que el List
resultante se construye a partir del LinkedList
. Por lo tanto, no es necesario reiniciar el almacenamiento intermedio después de exportar List
.
Dados sus requisitos, diría que ListBuffer
y MutableList
son equivalentes. Si desea exportar su lista interna en algún momento, pregúntese dónde desea la sobrecarga: cuando exporte la lista, y luego sin gastos generales si continúa mutando el búfer (luego vaya por MutableList
), o solo si puede cambiar el buffer de nuevo, y ninguno en el tiempo de exportación (luego vaya por ListBuffer
).
Supongo que en la revisión de la colección 2.8, MutableList
precedió ListBuffer
y todo el sistema Builder
.En realidad, MutableList
es principalmente útil desde el paquete collection.mutable
: tiene un método private[mutable] def toLinkedList
que regresa en tiempo constante y, por lo tanto, se puede usar de manera eficiente como constructor delegado para todas las estructuras que mantienen un LinkedList
internamente.
Así que también recomendaría ListBuffer
, ya que también puede llamar la atención y la optimización en el futuro que las estructuras "puramente mutables" como MutableList
y LinkedList
.
No creo que ListBuffer permita obtener/eliminar el último elemento en tiempo constante. vea [ListBuffer.scala] (https://github.com/scala/scala/blob/2.10.x/src/library/scala/collection/mutable/ListBuffer.scala) –
Tiene razón, parece que no . Lástima, porque podría hacerlo fácilmente. –