gpt4 book ai didi

Kotlin:String 类型的 ArrayList:应用程序在通过赋值初始化元素时崩溃

转载 作者:行者123 更新时间:2023-12-02 12:21:17 25 4
gpt4 key购买 nike

基本上,这段代码有效:

var optionsList = ArrayList<String>()
optionsList.add("Alpha")
optionsList.add("Bravo")
optionsList.add("Charlie")
optionsList[2] = "Foxtrot"// Assignment works (only) if initialization has been done previously through add()

但是,以下内容会使应用程序崩溃(没有编译时错误或警告):

var optionsList = ArrayList<String>(3)
optionsList[0] = "Alpha"
optionsList[1] = "Bravo"
optionsList[2] = "Charlie"

这似乎出乎意料,我无法弄清楚崩溃的原因。在我的理解中,这两种方式应该是等价的——第一种方式我们一次只为一个元素分配内存并初始化,而第二种方式我们在开始和后来改变值时一起为所有元素分配内存。

有人可以帮助我了解这里的幕后情况吗?我才刚刚开始学习 Kotlin 并且过去使用过 C++,所以这可能会影响我对此的看法。

最佳答案

在 Kotlin 中,list[n]list.get(n) 的简写,并带有赋值运算符 list[n] = value 它被翻译成 list.set(n, value)

optionsList[2] = "Foxtrot" 尝试覆盖 2 处的值并返回 KDocs 中定义的旧值(永远不会为空) ,那么如果该索引没有值,它将返回什么?

public E set(int index, E element) {
Objects.checkIndex(index, size);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}

确实是在内存中为中的值分配了空间

var optionsList = ArrayList<String>(3)

但是由于 operator fun set(index: Int, element: E): E 需要返回旧值,这是不可能的,因为该索引处的值从未存在过,所以它无法执行操作。

编辑:分配空间的目的是减少添加大量值所花费的时间,例如,如果您想添加大量值(如 10000),那么预分配(0.6ms) 比动态分配的 ArrayList (2ms) 花费的时间少大约 3.5 倍。请参阅:https://pl.kotl.in/iV3ZNNjOC

关于Kotlin:String 类型的 ArrayList:应用程序在通过赋值初始化元素时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62380605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com