原始字符串,这些与转义的字符串有何不同,应在哪里使用它们

时间:2018-09-20 06:22:43

标签: android string performance kotlin

根据我的研究

Kotlin有两种类型的字符串文字:-

转义的字符串,其中可能已转义了字符。

val s = "Hello ,World\n" +
    "from escaped string\n"+
    "kotlin"

原始字符串由三引号(“”“)分隔,不包含转义符,并且可以包含换行符和任何其他字符:

val m = """Hello, World
       |from raw string
       |kotlin """.trimMargin()

这些字符串可以在多行中使用,而无需将每行连接在一起,并且无需转义。

我们使用原始字符串仅仅是为了简单和易于实现,还是在任何情况下它们都提供更好的性能?

还有其他应该考虑使用原始字符串的用例吗?

3 个答案:

答案 0 :(得分:1)

您的答案在this website处得到了很好的解释。我将只在其中包括必要的部分。

String in Kotlin可以按上述链接中所述的多种方式使用。它完全取决于要使用的要求。如果您有超大字符串(如html页面等),则可以使用以三引号(“”“)分隔的原始字符串。 字符串,则可以使用转义的字符串

这两者之间并没有真正的性能差异,但是取决于您在其中构建值时使用了多少字符串连接。

答案 1 :(得分:1)

用例:会议室查询中查询语法的着色

使用Kotlin的原始字符串,您可以在Room的Dao中的多行上编写查询,例如:

@Dao
interface HappyDao {
    @Query(
            """
            SELECT
            One,
            Two,
            Three
            FROM MYTABLE
            """
    )
    fun getAll(): List<MyObject>
}

并且仍然具有Room验证器的语法着色,就像您将所有内容都写在一行上一样(以及代码编写过程中有关查询语法错误的警报)。对于长查询,具有许多字段或联接的情况,它特别有用。

没有原始字符串,将是这样的:

@Dao
interface HappyDao {
    @Query(
            "SELECT" +
            "One," +
            "Two," +
            "Three" +
            " FROM MYTABLE"
    )
    fun getAll(): List<MyObject>
}

,并且不会使用Room的语法着色。

答案 2 :(得分:0)

我不知道两种字符串文字类型之间的性能差异,但是至少有一个有趣的用例,您应该考虑使用原始字符串:正则表达式。

预定义字符类和正则表达式中的许多其他构造由\字符引入(例如\s以匹配空白字符)。在将这些字符包含在字符串中时,您需要对它们进行转义:因此,对于正则表达式中的任何此类字符,都需要编写两个字符,例如"\\d"以匹配单个数字。

但是,原始字符串使您可以跳过转义部分,从而比在Java中唯一的字符串文字类型被转义时所编写的正则表达式更简洁明了。

请注意,原始字符串不是新概念,也不是Kotlin引入的概念。例如,Python已经使用它们很长时间了。