Java字符串的处理方式及作用介绍

 更新时间:2025年05月17日 10:17:44   作者:阿乾之铭  
StringBuilder、StringBuffer 和 String是Java中处理字符串的三种主要方式,每种有不同的特点和适用场景,下面给大家介绍Java字符串的处理方法及作用介绍

StringBuilderStringBufferString 是 Java 中处理字符串的三种主要方式,每种有不同的特点和适用场景。让我们逐个详细了解它们的区别、作用及使用方法。

1. String 特性:

  • String 是不可变类(immutable),一旦创建就不能更改。如果对字符串进行修改操作,例如拼接、截取、替换等操作,都会产生新的字符串对象,并且旧的对象仍然保留在内存中,直到被垃圾回收。
  • 作用String 通常用于存储和操作不经常变化的字符串数据,如静态文本、标签、用户输入等。
  • 使用场景
    • 当字符串内容不频繁变化时适合使用 String,例如拼接少量字符串。
    • 因为不可变特性,String 对多线程是天然安全的,不会受到并发修改的影响。

示例代码

String str = "Hello";
str += " World";  // 会创建新的字符串对象 "Hello World"
System.out.println(str);  // 输出 "Hello World"
  • Java中的String类不可以被继承,因为String类被声明为final,禁止其他类继承它。 
  • String类型的“+”方法的底层实现:编译器将+转换为StringBuilderappend()链式调用,最后调用toString()生成新String对象。

2. StringBuffer

  • 特性
  • StringBuffer 是可变类(mutable),它在修改时不会创建新的对象。适合需要频繁修改字符串的场景。StringBuffer 是线程安全的,每个方法都加了 synchronized 关键字,保证在多线程环境下的安全性。
  • 作用:在多线程环境中需要频繁操作字符串时,StringBuffer 是更合适的选择。
  • 使用场景
    • 当多个线程可能会同时操作同一字符串时使用 StringBuffer
    • 在需要大量拼接字符串且要求线程安全的场景下,如在 appendinsert 等操作中使用。

示例代码

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb.toString());  // 输出 "Hello World"

3. StringBuilder

  • 特性StringBuilder 也是可变类,与 StringBuffer 的用法基本相同,适合频繁修改字符串内容的场景。但与 StringBuffer 不同的是,StringBuilder 不是线程安全的,因此在单线程环境中,StringBuilder 的性能更高。
  • 作用:在单线程环境下,StringBuilder 可以替代 StringBuffer,提供更高的性能。
  • 使用场景
    • 单线程环境下,频繁修改字符串的场合使用 StringBuilder
    • 推荐在需要拼接大量字符串且不涉及多线程的场景中使用 StringBuilder

示例代码

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString());  // 输出 "Hello World"

总结对比

特性StringStringBufferStringBuilder
是否可变不可变可变可变
线程安全
性能最低中等最高(单线程情况下)
使用场景少量字符串修改多线程环境中大量字符串修改单线程环境中大量字符串修改

StringBuilderStringBufferString 之间的转换方法

(1)String 转 StringBuilder / StringBuffer

使用 构造方法 直接转换:

// String -> StringBuilder
String str = "Hello";
StringBuilder stringBuilder = new StringBuilder(str);
// String -> StringBuffer
StringBuffer stringBuffer = new StringBuffer(str);

(2)StringBuilder / StringBuffer 转 String

使用 toString() 方法转换为 String

// StringBuilder -> String
StringBuilder stringBuilder = new StringBuilder("Hello");
String strFromBuilder = stringBuilder.toString();
// StringBuffer -> String
StringBuffer stringBuffer = new StringBuffer("Hello");
String strFromBuffer = stringBuffer.toString();

(3)StringBuilder 和 StringBuffer 之间转换

由于 StringBuilderStringBuffer 都有类似的构造方法,可以直接通过构造方法进行转换。

// StringBuilder -> StringBuffer
StringBuilder stringBuilder = new StringBuilder("Hello");
StringBuffer stringBuffer = new StringBuffer(stringBuilder);
// StringBuffer -> StringBuilder
StringBuffer stringBuffer2 = new StringBuffer("World");
StringBuilder stringBuilder2 = new StringBuilder(stringBuffer2);

1. String 的常用方法

由于 String 是不可变的,每次修改都会返回一个新对象。以下是常用方法:

1.1 charAt(int index)

获取指定位置的字符。

String str = "Hello";
char ch = str.charAt(1);  // 'e'

1.2 concat(String str)

拼接字符串,返回一个新的字符串。

String str1 = "Hello";
String str2 = str1.concat(" World");  // "Hello World"

1.3 substring(int beginIndex, int endIndex)

截取字符串的子串,返回新字符串。

String str = "Hello World";
String subStr = str.substring(0, 5);  // "Hello"

1.4 toUpperCase() / toLowerCase()

转换为大写或小写,返回新字符串。

String str = "Hello World";
String upper = str.toUpperCase();  // "HELLO WORLD"

1.5 replace(char oldChar, char newChar)

替换字符,返回新的字符串。replace() 方法有两个重载版本:

(1)replace(char oldChar, char newChar)
用于替换单个字符,参数是 char 类型,需要用单引号。

String str = "Hello World";
String noSpaceStr = str.replace(' ', ''); // 错误!第二个参数不能为空字符

注意:这里有一个问题,newChar 不能为空字符(''),因为 Java 中字符不能为空。所以这种方法不适用于去除空格。

(2)replace(CharSequence target, CharSequence replacement)
用于替换字符串,参数是 CharSequence 类型(String 是其子类),需要用双引号。

String str = "Hello World";
String noSpaceStr = str.replace(" ", ""); // 正确!用空字符串替换空格字符串

为什么用双引号?

在去除空格时,我们通常希望将空格字符串(" ")替换为空字符串(""),而不是替换单个字符。因此,使用双引号的 replace(" ", "") 是正确的做法。

1.6 split(String regex)

根据正则表达式分割字符串,返回字符串数组。

String str = "Hello,World,Java";
String[] parts = str.split(",");  // ["Hello", "World", "Java"]

1.7 equals(Object obj)

比较字符串内容是否相等。

String str1 = "Hello";
String str2 = "Hello";
boolean isEqual = str1.equals(str2);  // true

1.8 isEmpty()

判断字符串是否为空。

String str = "";
boolean isEmpty = str.isEmpty();  // true

1.9 toCharArray()

将字符串转换为字符数组。

String str = "Hello";
char[] charArray = str.toCharArray();  // ['H', 'e', 'l', 'l', 'o']

1.10 String.valueOf(char[] data)

String 类的静态方法 valueOf 也可以将 char 数组转换为 String

char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str = String.valueOf(charArray);  // "Hello"

2. StringBuffer 的常用方法

StringBuffer 是可变的,支持在原对象上修改字符串。以下是一些常见的方法:

2.1 append(String str)(有重载版本添加其他数据类型,比如char)

在末尾添加字符串,修改原对象。

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");  // 修改后变为 "Hello World"

2.2 insert(int offset, String str)

在指定位置插入字符串。

StringBuffer sb = new StringBuffer("Hello World");
sb.insert(5, ",");  // 修改后变为 "Hello, World"

2.3 replace(int start, int end, String str)

替换指定范围内的内容。

StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java");  // 修改后变为 "Hello Java"

2.4 delete(int start, int end)

删除指定范围内的字符。

StringBuffer sb = new StringBuffer("Hello World");
sb.delete(5, 11);  // 修改后变为 "Hello"

2.5 reverse()

将字符串内容反转。

StringBuffer sb = new StringBuffer("Hello");
sb.reverse();  // 修改后变为 "olleH"

2.6 deleteCharAt(int index)

删除指定位置的字符 

StringBuffer sbf = new StringBuffer("Java?");
sbf.deleteCharAt(sbf.length() - 1); // 删除最后一个字符 '?'
System.out.println(sbf); // 输出: Java

3. StringBuilder 的常用方法

StringBuilderStringBuffer 方法相同,但不加锁,适合单线程场景。以下列举常用方法:

3.1 append(String str) (有重载版本添加其他数据类型,比如char)

在末尾添加字符串。

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");  // 修改后变为 "Hello World"

3.2 insert(int offset, String str)

在指定位置插入字符串。

StringBuilder sb = new StringBuilder("Hello World");
sb.insert(5, ",");  // 修改后变为 "Hello, World"

3.3 replace(int start, int end, String str)

替换指定范围的内容。

StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");  // 修改后变为 "Hello Java"

3.4 delete(int start, int end)

删除指定范围的字符。

StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11);  // 修改后变为 "Hello"

3.5 reverse()

将字符串内容反转。

StringBuilder sb = new StringBuilder("Hello");
sb.reverse();  // 修改后变为 "olleH"

3.6 deleteCharAt(int index)

删除指定位置的字符 

StringBuilder sb = new StringBuilder("Hello!");
sb.deleteCharAt(5); // 删除索引5位置的字符 '!'
System.out.println(sb); // 输出: Hello

到此这篇关于Java字符串的处理的文章就介绍到这了,更多相关Java字符串处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中的instanceof用法详解及instanceof是什么意思(推荐)

    java 中的instanceof用法详解及instanceof是什么意思(推荐)

    instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。接下来通过本文给大家介绍java 中的instanceof用法详解及instanceof是什么意思,需要的朋友参考下吧
    2017-11-11
  • springboot根据实体类生成表的实现方法

    springboot根据实体类生成表的实现方法

    本文介绍了如何通过SpringBoot工程引入SpringDataJPA,并通过实体类自动生成数据库表的过程,包括常见问题解决方法,感兴趣的可以了解一下
    2024-09-09
  • Java中wait与sleep的区别讲解(wait有参及无参区别)

    Java中wait与sleep的区别讲解(wait有参及无参区别)

    这篇文章主要介绍了Java中wait与sleep的讲解(wait有参及无参区别),通过代码介绍了wait() 与wait( long timeout ) 区别,wait(0) 与 sleep(0)区别,需要的朋友可以参考下
    2022-04-04
  • Java反应式框架Reactor中的Mono和Flux

    Java反应式框架Reactor中的Mono和Flux

    这篇文章主要介绍了Java反应式框架Reactor中的Mono和Flux,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringMVC之DispatcherServlet配置文件应该放在哪里呢

    SpringMVC之DispatcherServlet配置文件应该放在哪里呢

    这篇文章主要介绍了SpringMVC之DispatcherServlet配置文件应该放在哪里的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解springboot使用异步注解@Async获取执行结果的坑

    详解springboot使用异步注解@Async获取执行结果的坑

    本文主要介绍了springboot使用异步注解@Async获取执行结果的坑,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 深入理解HashMap各个方法的源码

    深入理解HashMap各个方法的源码

    这篇文章主要介绍了深入理解HashMap各个方法的源码,HashMap初始容量不能为负数,若初始容量大于最大容量,则让它等于最大容量,负载因子必须大于0,并且传入的initialCapacity不是HashMap的容量大小,需要的朋友可以参考下
    2023-12-12
  • SpringBoot应用刚启动时服务报大量超时的问题及解决

    SpringBoot应用刚启动时服务报大量超时的问题及解决

    在Java项目上线过程中,经常遇到的超时问题主要是由于JVM的JIT编译导致,JIT(Just-In-Time)编译是Java虚拟机的一项技术,用于提高Java应用的性能,它通过将热点代码(频繁执行的部分)转换成本地机器码来优化执行效率
    2024-11-11
  • 详解Spring事件发布与监听机制

    详解Spring事件发布与监听机制

    Spring提供了ApplicationContext事件机制,可以发布和监听事件,这个特性非常有用。Spring内置了一些事件和监听器,例如在Spring容器启动前,Spring容器启动后,应用启动失败后等事件发生后,监听在这些事件上的监听器会做出相应的响应处理
    2021-06-06
  • JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍

    JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍

    这篇文章主要介绍了JAVA加密算法- 非对称加密算法(DH,RSA),详细介绍了DH,RSA的用法和示例,需要的朋友可以了解一下。
    2016-11-11

最新评论