MST

星途 面试题库

面试题:Rust中字符串比较的常见方法及应用场景

在Rust中,有哪些常见的方法用于比较字符串?请分别举例说明每种方法适用的场景,并阐述它们之间的区别。例如比较`String`类型和`&str`类型字符串时应注意什么。
35.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

1. eq 方法

  • 适用场景:用于判断两个字符串是否完全相等,比较的是字符串的内容。
  • 示例
let s1 = String::from("hello");
let s2 = String::from("hello");
let s3 = String::from("world");

assert!(s1.eq(&s2));
assert!(!s1.eq(&s3));

let str1 = "hello";
assert!(s1.eq(str1));
  • 注意:可用于 StringStringString&str&str&str 的比较。

2. cmp 方法

  • 适用场景:用于对字符串进行排序比较,返回一个 Ordering 枚举值,表示两个字符串的顺序关系(小于、等于、大于)。
  • 示例
let s1 = String::from("abc");
let s2 = String::from("def");
let s3 = String::from("abc");

match s1.cmp(&s2) {
    std::cmp::Ordering::Less => println!("s1 is less than s2"),
    std::cmp::Ordering::Equal => println!("s1 is equal to s2"),
    std::cmp::Ordering::Greater => println!("s1 is greater than s2"),
}

match s1.cmp(&s3) {
    std::cmp::Ordering::Less => println!("s1 is less than s3"),
    std::cmp::Ordering::Equal => println!("s1 is equal to s3"),
    std::cmp::Ordering::Greater => println!("s1 is greater than s3"),
}
  • 注意:同样可用于 StringStringString&str&str&str 的比较。

3. starts_withends_with 方法

  • 适用场景starts_with 用于判断字符串是否以某个前缀开头,ends_with 用于判断字符串是否以某个后缀结尾。
  • 示例
let s = String::from("hello world");
assert!(s.starts_with("hello"));
assert!(s.ends_with("world"));
  • 注意:适用于 String&str(前缀或后缀)的比较,主要关注字符串的起始或结束部分内容。

比较 String 类型和 &str 类型字符串时的注意事项

  • 所有权String 拥有字符串内容的所有权,是可增长、可改变的堆上数据结构;而 &str 是字符串切片,指向某个字符串内容,不拥有所有权,通常指向 String 或字符串字面量。
  • 方法调用String 类型和 &str 类型都实现了很多相同的字符串操作方法,但在调用时要注意类型匹配。例如,eqcmp 等方法在两种类型上都可用,但如果一个函数要求 &str 参数,传入 String 时需要使用 & 取引用;反之,如果函数要求 String 参数,传入 &str 时可能需要使用 to_string 方法转换为 String
  • 性能&str 操作通常更高效,因为它避免了 String 类型可能涉及的堆内存分配和释放操作。在性能敏感的场景,如果不需要修改字符串,应优先使用 &str