【问题标题】:Does Kotlin support string/array slices by reference like Rust and Swift?Kotlin 是否像 Rust 和 Swift 那样通过引用支持字符串/数组切片?
【发布时间】:2021-08-21 05:05:46
【问题描述】:

RustSwift 中,您可以创建一个/两个数组和字符串的切片,它不会创建元素的新副本,但可以使用范围或迭代器查看现有元素并实现内部是引用对或引用 + 长度。

Kotlin 有类似的概念吗?好像有similar concept for lists

这对 Google 来说很难,因为有一个名为“slice”的函数似乎可以复制元素。是我弄错了还是丢失了?

(我知道我可以轻松解决它。顺便说一句,我没有 Java 背景。)

【问题讨论】:

  • 我自己是 Kotlin 的新手,但看起来 Kotlin(如 Java)只有 pass by value - Link
  • @clmno Java 总是按值传递引用
  • List.subList 确实是底层List 的一个视图——所以它会在不复制的情况下进行“切片”。 String 没有这样的功能 - subString 将创建底层char[] 的副本;对此进行了更改,以避免出现这样的问题:例如,将整个文件放入内存,然后将 subString 的一小部分放入内存中 - 小的 String 然后将大的保存在内存中。
  • @BoristheSpider 请注意,substring()subSequence() 方法都没有明确指定它不创建视图或复制数据。由于字符串是不可变的,我认为从开发人员的角度来看这并不重要,我们不应该真正关心。 Java 不是开发人员可以完全控制内存布局等的语言 - 这被认为是底层 VM/stdlib 的实现细节,并且对开发人员是隐藏的。可能有一个 Java 的实现,例如如果子字符串超过原始字符串的 80%,则创建一个视图。
  • 当我们拥有可变数据时开始变得重要。事实上,CharBufferCharSequence 的另一个实现,但它是可变的,它具有创建视图的slice() 方法。 @hippietrail ,如果您可以使用CharSequence 而不是字符串(它们在某种程度上相似),那么您可以选择使用CharBuffer。但是,我不确定这是否真的有意义。在大多数情况下,复制数据并没有那么糟糕。

标签: arrays string kotlin slice


【解决方案1】:

我不这么认为。

您可以使用asList 以列表形式查看阵列。然后您已经找到的函数subList 照常工作。但是,我不知道Arrays 与subList 的等效项。从asList 返回的列表是不可变的,因此您不能使用它来修改数组。如果您尝试通过toMutableList 使列表可变,它只会创建一个新副本。

fun main() {
    val alphabet = CharArray(26) { 'a' + it }
    println(alphabet.joinToString(", "))

    val listView = alphabet.asList().subList(10, 15)
    println(listView)

    for (i in alphabet.indices) alphabet[i] = alphabet[i].toUpperCase()
    println(alphabet.joinToString(", "))
    // listView is also updated
    println(listView)
}

输出:

a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
[k, l, m, n, o]
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
[K, L, M, N, O]

在 Kotlin 中首选使用列表(或 Collections),并且比数组更好地支持泛型和不变性。

如果您需要改变数组,您可能必须自己管理它,传递(对)数组和您关心的索引的IntRange

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多