JAVA面试题:String、Stringbuffer、StringBuilder的区别

一、先说结论

String类一旦创建了一个String对象,它的值就不能改变,对String进行操作时,都会创建一个新的String对象,此外,String是线程安全的。StringBuffer对象可变,可以对其内容进行修改而不产生新的对象,StringBuffer是线程安全的,适用于多线程的环境。StringBuilder在进行字符串拼接和修改时效率比StringBuffer更高,因为它的方法不是同步的,所以它也是线程不安全的。

二、String

在 Java 中,String 是一个非常重要的类,用于表示和操作文本数据。它是 java.lang 包的一部分。

  • 不可变性String 对象是不可变的。一旦创建了一个 String 对象,它的值就不能被改变。每次对字符串进行操作(如连接、截取等)时,都会生成一个新的 String 对象。
  • 线程安全:由于 String 是不可变的,它是线程安全的,可以在多个线程中共享而不需要额外的同步。
  • 性能:由于每次操作都会生成新的对象,所以频繁的字符串操作会导致较多的内存开销和性能问题。
String str = "Hello";
str = str + " World"; // 产生了一个新的字符串对象 "Hello World"

主要方法

1. 长度

  • length(): 返回字符串的长度。

2. 字符访问

  • charAt(int index): 返回指定索引位置的字符。

3. 子字符串

  • substring(int beginIndex): 返回从指定索引开始到字符串末尾的子字符串。

  • substring(int beginIndex, int endIndex): 返回从 beginIndexendIndex 之间的子字符串。

4. 字符串连接

  • concat(String str): 将指定字符串连接到当前字符串的末尾。

5. 字符串替换

  • replace(CharSequence target, CharSequence replacement): 替换字符串中所有匹配的字符序列。

6. 去除空格

  • trim(): 去除字符串前后的空格。

7. 字符串分割

  • split(String regex): 根据指定的正则表达式将字符串分割成一个字符串数组。
  • split(String regex, int limit): 根据指定的正则表达式将字符串分割成一个字符串数组,指定数组的最大长度。

8. 转换大小写

  • toUpperCase(): 将字符串转换为大写。
  • toLowerCase(): 将字符串转换为小写。

9. 比较

  • equals(Object anObject): 比较两个字符串的内容是否相同。
  • equalsIgnoreCase(String anotherString): 忽略大小写比较两个字符串。
  • compareTo(String anotherString): 按字典顺序比较两个字符串。
  • compareToIgnoreCase(String anotherString): 忽略大小写按字典顺序比较两个字符串。

10. 查找

  • indexOf(int ch): 返回指定字符在字符串中第一次出现的位置。
  • indexOf(String str): 返回指定子字符串在字符串中第一次出现的位置。
  • lastIndexOf(int ch): 返回指定字符在字符串中最后一次出现的位置。
  • lastIndexOf(String str): 返回指定子字符串在字符串中最后一次出现的位置。

11. 是否包含

  • contains(CharSequence sequence): 判断字符串是否包含指定的字符序列。

12. 开头和结尾

  • startsWith(String prefix): 判断字符串是否以指定前缀开始。
  • endsWith(String suffix): 判断字符串是否以指定后缀结束。

字符串池

  • 字符串常量池:Java 使用字符串池来存储字符串常量。当你使用 String 字面量时,Java 会检查字符串池中是否已存在该字符串,如果存在,则复用,否则创建一个新的 String 对象并放入池中。

性能考虑

  • 不可变性带来的性能:由于 String 对象是不可变的,字符串操作(如连接)可能会涉及创建多个临时 String 对象。为了提高性能,可以使用 StringBuilderStringBuffer 类来处理频繁的字符串修改操作。

三、StringBuilder

在 Java 中,StringBuilder 是一个可变的字符序列类,用于创建和操作字符串。与 String 不同,StringBuilder 允许你修改字符串的内容而无需创建新的对象,这样可以提高性能,特别是在需要频繁修改字符串的情况下。

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 修改了现有对象

主要特点

  1. 可变性StringBuilder 对象可以在创建后修改其内容,不会创建新的对象。
  2. 性能:对于频繁的字符串操作,如拼接或插入,StringBuilderString 更高效,因为它避免了大量的临时对象创建。
  3. 线程不安全StringBuilder 是线程不安全的,因此在多线程环境中需要额外的同步处理。如果需要线程安全的可变字符串,可以使用 StringBuffer 类。

常用方法

1. 构造方法

  • StringBuilder(): 创建一个空的 StringBuilder 对象。
  • StringBuilder(String str): 使用指定的字符串初始化 StringBuilder 对象。

2. 字符串拼接

  • append(boolean b): 将布尔值添加到 StringBuilder
  • append(char c): 将字符添加到 StringBuilder
  • append(String str): 将指定的字符串添加到 StringBuilder

3. 插入

  • insert(int offset, String str): 在指定位置插入指定的字符串。
  • insert(int offset, char c): 在指定位置插入字符。

4. 删除

  • delete(int start, int end): 删除从指定起始位置到结束位置的字符。
  • deleteCharAt(int index): 删除指定位置的字符。

5. 替换

  • replace(int start, int end, String str): 替换从指定起始位置到结束位置的字符为指定字符串。

6. 反转

  • reverse(): 反转 StringBuilder 中的字符顺序。

7. 转换为字符串

  • toString(): 返回 StringBuilder 的字符串表示形式。

四、StringBuffer

StringBuffer 是 Java 中用于创建和操作可变字符序列的类,与 StringBuilder 类似,但有一些重要的区别。StringBuffer 是线程安全的,因此可以在多线程环境中安全地使用。

主要特点

  • 可变性StringBuffer 对象可以在创建后修改其内容,不会创建新的对象。
  • 线程安全StringBuffer 提供了同步操作,以确保在多线程环境下对 StringBuffer 对象的操作是线程安全的。这是通过同步方法实现的。
  • 性能:虽然 StringBuffer 是线程安全的,但由于同步开销,它在单线程环境中的性能通常不如 StringBuilder
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 修改了现有对象

常用方法

StringBuilder 的方法与 StringBuffer 几乎相同,但没有线程安全的同步机制

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值