String 科特林:有子字符串的类吗?

String 科特林:有子字符串的类吗?,string,kotlin,substring,String,Kotlin,Substring,有一个以字符串作为输入的递归函数。它将这个字符串分成几个部分,并为每个部分调用自己。此函数不更改输入字符串,只读取它。该功能在Kotlin中实现。 要创建子字符串,请调用substring函数: myFunc(str.substring(begin, length)) 人们对这一实施的有效性表示怀疑。为每个调用创建一个新字符串,尽管它足以在原始字符串中传递子字符串的开头和长度。 Kotlin有子字符串类吗?例如,在C++标准库中有一个类,而在Qt中有一个类。科特林也有类似的情况吗 或者

有一个以字符串作为输入的递归函数。它将这个字符串分成几个部分,并为每个部分调用自己。此函数不更改输入字符串,只读取它。该功能在Kotlin中实现。 要创建子字符串,请调用substring函数:

    myFunc(str.substring(begin, length))
人们对这一实施的有效性表示怀疑。为每个调用创建一个新字符串,尽管它足以在原始字符串中传递子字符串的开头和长度。 Kotlin有子字符串类吗?例如,在C++标准库中有一个类,而在Qt中有一个类。科特林也有类似的情况吗


或者可能字符串类已经优化,子字符串函数没有分配新内存,而新实例在内存中使用了与原始实例相同的缓冲区?

您可以自己查看源代码进行检查

在java.lang.String(由Kotlin/JVM使用)的情况下,在Java7之前它是相当简单的:字符串有一个对字符数组的引用,以及开始和结束索引。因此,虽然子字符串必须是一个新的字符串实例,但它引用了与生成它的字符串相同的字符数组。换句话说,它优化了子字符串的情况

但是,String类现在更复杂了,而且似乎在堆使用方面得到了更多的优化:请参阅


如果您真的关心这个特定方法的性能,您可以完全不创建对象,而是传入原始字符串和您自己的开始值和结束值。然而,通常的优化规则是适用的:只有当代码处于热点时,才值得让代码复杂化——您需要做一些测试来证明它是否存在,以及您的重写是否确实改善了情况。

如果标准库函数中没有任何方法,您可以创建扩展功能以提供更丰富的支持。

示例:删除字符串的第一个和最后一个字符

fun String.removeFirstLastChar(): String =  this.substring(1, this.length - 1)

fun main(args: Array<String>) {
    val myString= "Hello Everyone"
    val result = myString.removeFirstLastChar()
    println("First character is: $result")
}
When y
这里,一个扩展函数removeFirstLastChar()被添加到String类中

类名是接收方类型(在我们的示例中是String类)。扩展函数中的this关键字引用接收方对象

First character is: ello Everyon