Java字符串的处理方式及作用介绍
作者:阿乾之铭
StringBuilder
、StringBuffer
和 String
是 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类型的“+”方法的底层实现:编译器将
+
转换为StringBuilder
的append()
链式调用,最后调用toString()
生成新String对象。
2. StringBuffer
- 特性:
StringBuffer
是可变类(mutable),它在修改时不会创建新的对象。适合需要频繁修改字符串的场景。StringBuffer
是线程安全的,每个方法都加了synchronized
关键字,保证在多线程环境下的安全性。- 作用:在多线程环境中需要频繁操作字符串时,
StringBuffer
是更合适的选择。 - 使用场景:
- 当多个线程可能会同时操作同一字符串时使用
StringBuffer
。 - 在需要大量拼接字符串且要求线程安全的场景下,如在
append
、insert
等操作中使用。
- 当多个线程可能会同时操作同一字符串时使用
示例代码:
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"
总结对比
特性 | String | StringBuffer | StringBuilder |
---|---|---|---|
是否可变 | 不可变 | 可变 | 可变 |
线程安全 | 是 | 是 | 否 |
性能 | 最低 | 中等 | 最高(单线程情况下) |
使用场景 | 少量字符串修改 | 多线程环境中大量字符串修改 | 单线程环境中大量字符串修改 |
StringBuilder
、StringBuffer
和 String
之间的转换方法
(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 之间转换
由于
StringBuilder
和StringBuffer
都有类似的构造方法,可以直接通过构造方法进行转换。
// 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
的常用方法
StringBuilder
与 StringBuffer
方法相同,但不加锁,适合单线程场景。以下列举常用方法:
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字符串处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!