字符串基本使用和相等性判断

在 Scala 中,String 是一个不可变的对象,所以该对象不可被修改。这就意味着如果修改字符串就会产生一个新的字符串对象。但其他对象,如数组就是可变的对象。

字符串基本使用

Scala中字符串的数据类型是java.lang.String。如下面的代码所示:

println("Hello, world".getClass.getName)     // java.lang.String

实际上,Scala String就是Java String,所以可以使用所有常规的Java字符串方法。和Java中一样,在Scala中字符串对象有个length方法,可返回该字符串的长度,即该字符串包含的字符个数。如下代码所示:

val s = "Hello, world"
println(s.length)             // 12

两个字符串可以使用+号连接起来:

println("Hello" + " world")    // "Hello world"

但是因为Scala提供了隐式转换的魔法,String实例还可以访问StringOps类的所有方法,因此可以使用它们做许多其他事情,比如将String实例视为字符序列。因此,可以使用foreach方法遍历字符串中的每个字符,Scala将字符串当作一个字符序列。例如,我们可以遍历字符串,访问字符串中的每个字符:

"hello".foreach(println)      // 遍历字符串中的每个字符

输出结果如下所示:

h
e
l
l
o

也可以将字符串视为for循环中的字符序列。如下面的代码所示:

for (c <- "hello") println(c)

输出结果如下所示:

h
e
l
l
o

Scala中字符串有一个getBytes方法,返回每个字符对应的AscII值数组。代码如下所示:

s.getBytes.foreach(println)

输出结果如下所示:

72
101
108
108
111
44
32
119
111
114
108
100

因为顺序集合上有很多可用的方法,所以也可以使用其他函数方法,如filter,以及其他操作方法。例如:

val result = "hello world".filter(_ != 'l')
println("result=" + result)             // result=heo word

"scala".drop(2).take(2).capitalize      // Al

可通过索引访问字符串中的一个字符。如下面的代码所示:

// 访问字符串中的一个字符
println("hello".charAt(0))     // 'h'
println("hello"(0))           // 'h'
println("hello"(1))           // 'e'

字符串也可以使用运算符,例如:

val greeting = "Hello, " + "World"
val matched = (greeting == "Hello, World")
val theme = "Na " * 16 + "Batman!"

输出结果如下所示:

greeting: String = Hello, World
matched: Boolean = true

判断字符串相等性

在Scala中,字符串是按照内容来进行比较的。下面的代码演示了如下判断字符串的相等性:

    val s1 = "Hello"
    val s2 = "Hello"
    val s3 = "H" + "ello"
    println("s1 == s2: " + (s1 == s2))     // true
    println("s1 == s3: " + (s1 == s3))     // true
    
    println("-------------------------")
    val s4: String = null
    println("s3 == s4: " + (s3 == s4))     // false
    println("s4 == s3: " + (s4 == s3))     // false
    
    println("-------------------------")
    val s11: String = null
    val s22: String = null
    println("s11 == s22: " + (s11 == s22))  // true
    
    println("-------------------------")
    val a = "Marisa"
    val b = "marisa"
    println("a == b: " + (a == b))          // false

    println("a.equalsIgnoreCase(b):" + (a.equalsIgnoreCase(b)))    // true

在Scala中,使用==方法测试对象是否相等。这与Java不同,在Java中使用equals方法比较两个对象。在Scala中,AnyRef类中定义的==方法首先检查null值,然后调用第一个对象(即this)上的equals方法看这两个对象是否相等。因此,在比较字符串时不必检查null值。


《Spark原理深入与编程实战》