【发布时间】:2019-03-12 14:42:46
【问题描述】:
你好我想知道加入两个可变列表的最佳性能
if list1.addall (list2)
with foreach
list1?.let { list1 -> list2?.let(list1::addAll) }
或地图或类似的东西..?
【问题讨论】:
标签: performance kotlin mutablelist
你好我想知道加入两个可变列表的最佳性能
if list1.addall (list2)
with foreach
list1?.let { list1 -> list2?.let(list1::addAll) }
或地图或类似的东西..?
【问题讨论】:
标签: performance kotlin mutablelist
如果第一个列表是可变的并且你想修改它,只需使用+= 运算符:
list1 += list2
它委托给addAll成员函数,将list2的所有元素附加到list1
如果您不想改变原始列表,请使用+ 运算符:
val result = list1 + list2
它将两个列表连接到第三个新列表中。与手动创建一个空的 ArrayList 并在其上调用 addAll 相比,此运算符的优势在于将生成的 ArrayList 预置为估计大小,因此有助于避免 ArrayList 的存储阵列重新分配。
【讨论】:
如果list1 是可变的并且您可以修改它:
list1.addAll(list1.size, list2)
在list1 中,您将拥有list1 + list2
如果不能修改可以创建ArrayList或LinkedList全部添加
val newList = ArrayList<Int>()
newList.addAll(list1)
newList.addAll(list2)
【讨论】:
如果它们都属于同一类型,那么您可以在 Kotlin 中使用平面地图。 例如,
val listA = mutableList<String>()
val listB = mutableList<String>()
然后你可以像下面这样合并它们
val mergedList = listOf(listA, listB).flatten()
或
val mergedList = listOf(listA, listB).flatMap { it }
这样更高效、更易读、代码更少!!使用 kotlin 编码愉快!
【讨论】:
最好的选择是创建一个 LinkedList,因为向其中添加项目总是很便宜,而 ArrayList 有时可能会在到达数组末尾时分配更多空间。
有关主题When to use LinkedList over ArrayList in Java? 的更多信息,请参阅此处
如果 list1 还不是 LinkedList,请记住 mutableListOf() 返回一个 ArrayList,那么您可以像这样创建第三个列表:
val newList = LinkedList<Int>()
list1.forEach {
newList += it
}
list2.forEach {
newList += it
}
【讨论】: