【发布时间】:2021-08-21 05:05:46
【问题描述】:
在Rust 和Swift 中,您可以创建一个/两个数组和字符串的切片,它不会创建元素的新副本,但可以使用范围或迭代器查看现有元素并实现内部是引用对或引用 + 长度。
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%,则创建一个视图。 -
当我们拥有可变数据时开始变得重要。事实上,
CharBuffer是CharSequence的另一个实现,但它是可变的,它具有创建视图的slice()方法。 @hippietrail ,如果您可以使用CharSequence而不是字符串(它们在某种程度上相似),那么您可以选择使用CharBuffer。但是,我不确定这是否真的有意义。在大多数情况下,复制数据并没有那么糟糕。
标签: arrays string kotlin slice