- 1️⃣ StringBuffer类
-
- 1.1 概念
- 1.2 特征
- 1.3 使用
- 2️⃣ StringBuilder类
-
- 2.1 概念及特征
- 2.2 使用
- 3️⃣ String、StringBuffer和StringBuilder的对比
- * 本文源码下载地址
1️⃣ StringBuffer类
1.1 概念
在Java 中,字符串使用 String
类进行表示,但是 String
类所表示的字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是 改变的是其内存地址的指向”。所以String
类不适合于被频繁修改的字符串操作, 所以在这种情况下,往往可以使用 StringBuffer
或者StringBuilder
类,即 StringBuffer
类或者StringBuilder
类更方便用户进行内容的修改。
在String
类中使用 “+
” 作为数据库的连接操作,而在 StringBuffer
类中使用 append()
方法进行数据的连接。方法定义:
public StringBuffer append(数据 类型变量);
// 范例 1: 观察StringBuffer 基本使用
package com.xiaoshan.demo;
public class TestDemo {
public static void main(String[] args) throws Exception{
//String类可以直接赋值实例化,但是StringBuffer类不行
StringBuffer buf = new StringBuffer(); //实例化StringBuffer类对象
buf.append("Hello ").append("XIAOSHAN ").append("!");
change(buf); //引用传递
System.out.println(buf);
}
public static void change(StringBuffer temp){
// 接收StringBuffer引用
temp.append("\n").append("'https://blog.csdn.net/lvsongtao1225/category_12367710.html");//修改内容
}
}
程序执行结果:
Hello XIAOSHAN !
https://blog.csdn.net/lvsongtao1225/category_12367710.html
此程序利用 StringBuffer
类对象实现了引用传递,并且通过最终的结果发现,在 change()
方法中针对 StringBuffer
对象的修改可以影响原始 StringBuffer
类对象,所以 StringBuffer
对象的内容是可以修改的。
StringBuffer
类主要用于频繁修改字符串的操作上。但是在任何开发中,面对字符串的操作,大部分情况下都先考虑 String
类,只有在需要频繁修改时才会考虑使用 StringBuffer
或 StringBuilder
类操作。
通过以上两个类的定义结构可以发现, String
类与 StringBuffer
类都是 CharSequence
接口的子类,也就证明 String
或 StringBuffer
类的对象都可以利用自动向上转型的操作为 CharSequence
接口实例化。
1.2 特征
StringBuffer
类是Java中一个被广泛使用的可变字符串类。它提供了许多方法来操作和修改字符串内容,而不会创建新的对象实例。
以下是StringBuffer
类的一些重要特点:
- 可变性:StringBuffer对象是可变的,意味着可以通过调用相应的方法对其内容进行修改,而不会创建新的对象。相比之下,String对象是不可变的,一旦创建后就无法更改;
- 线程安全:StringBuffer类是线程安全的,这意味着它的方法在多线程环境中可以安全地使用,不会导致竞态条件或数据不一致的问题。然而,由于其需要额外的同步开销,这可能会影响性能。如果不需要线程安全的操作,可以使用非线程安全的兄弟类StringBuilder,它具有相似的功能但性能更高;
- 性能考虑:由于字符串是可变的,可以在执行一系列操作后一次性获取最终结果,避免了频繁的字符串拷贝和内存分配,因此在某些情况下,StringBuffer比使用+或concat()操作符连接字符串更高效。
1.3 使用
以下是StringBuffer
类的一些用法:
- 字符串操作:StringBuffer类提供了一系列方法来操作字符串,如添加字符、插入字符、替换字符、删除字符等。这些方法可以根据需要灵活地修改字符串内容;
- 连接字符串:StringBuffer类也可以用于高效地连接字符串,而不像String那样每次连接都创建一个新的字符串对象。append()方法用于在当前字符串末尾添加字符、字符串和其他数据类型的值;
- 反转字符串:StringBuffer类提供了reverse()方法,用于反转当前字符串的顺序。这对于需要逆序处理字符串的场景很有用。
下面是一个使用StringBuffer
类的使用示例:
// 范例 2: StringBuffer类的使用
public static void main(String[] args) {
// 创建一个空的StringBuffer对象
StringBuffer sb = new StringBuffer();
// 在末尾添加字符串
sb.append("Hello");
sb.append(" World!");
// 输出:Hello World!
System.out.println(sb.toString());
// 在指定位置插入字符串
sb.insert(5, "Java ");
System.out.println(sb.toString());
// 反转字符串
sb.reverse();
System.out.println(sb.toString());
}
输出结果:
Hello World!
HelloJava World!
!dlroW avaJolleH
总之,StringBuffer
类是处理可变字符串的强大工具,特别适用于需要经常修改字符串内容的场景。并且它的方法是线程安全的,可以在多线程环境中安全地使用,不会导致竞态条件或数据不一致的问题。但由于其需要额外的同步开销,也同时会影响一些性能。
2️⃣ StringBuilder类
2.1 概念及特征
StringBuilder
是 Java 中的一个类,它允许可变长度的字符串操作。与 String
类不同,StringBuilder
对象的长度和内容都可以修改。这意味着可以在已存在的字符串上进行添加、删除和修改操作,而无需创建新的对象。
以下是该类的一些重要特性:
- 可变性:StringBuilder 具有可变性,这意味着可以动态地更改字符串内容和长度;
- 高效性:相对于直接使用 + 运算符连接字符串的方式,使用 StringBuilder 在性能上更高效。当需要频繁进行字符串操作时,使用 StringBuilder 可以减少系统开销。
2.2 使用
以下是该类的一些使用方法:
- 初始化:可以通过无参构造函数创建一个空的 StringBuilder 对象,或者可以根据已存在的字符串创建对象;还可以指定初始容量创建对象。
- append()方法:用于在当前字符串末尾附加给定的数据;
- delete()方法:用于删除当前字符串中指定范围内的字符;
- insert()方法:用于将给定的数据插入到当前字符串的指定位置;
- replace():该方法用于替换当前字符串指定范围内的字符;
- reverse():该方法用于逆转当前字符串的字符顺序;
- toString():该方法用于将 StringBuilder 对象转换为一个普通的字符串。
下面是一个使用StringBuilder
类的示例:
// 范例 3: StringBuilder类的使用
public static void main(String[] args) {
// 创建一个空的 StringBuilder 对象
StringBuilder sb1 = new StringBuilder();
// 根据已存在的字符串创建 StringBuilder 对象
StringBuilder sb2 = new StringBuilder("Hello");
// 指定初始容量创建 StringBuilder 对象
StringBuilder sb3 = new StringBuilder(10);
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("World");
System.out.println(sb.toString());
sb.delete(5, 10);
System.out.println(sb.toString());
sb.insert(5, " World");
System.out.println(sb.toString());
sb.replace(5, 11, " Everybody");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
String str = sb.toString();
System.out.println(str);
}
输出结果:
HelloWorld
Hello
Hello World
Hello Everybody
ydobyrevE olleH
ydobyrevE olleH
除了上面提到的常用方法之外,StringBuilder
还有其他一些方法可以查询和修改字符串。请参考 Java 官方文档 以获取更详尽的信息。
3️⃣ String、StringBuffer和StringBuilder的对比
String
类:适用于少量的字符串不变的操作;
StringBuilder
类:适用于单线程下在字符串缓冲区进行大量操作;
StringBuffer
类:适用于多线程下在字符串缓冲区进行大量操作。
- String类表示不可变的(immutable)字符串,该类是 final修饰的类,不能被继承且表示***字符串常量(字符串常量一旦声明则不可改变,而字符串对象可以改变,改变的是其内存地址的指向)***,对String修改会产生新的对象,效率低。而StringBuilder和StringBuffer均为可变字符串;
- String类使用 + 和 concat() 方法做数据的连接操作,而在StringBuffer类和StringBuilder类中使用 append()方法进行数据连接;
- StringBuilder是非线程安全的,不保证同步所以在性能上较高;StringBuffer是线程安全的,该类方法都使用了 synchronized 修饰,所以符合多线程操作中的安全要求。
* 本文源码下载地址
Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分…)
[ ]nbsp_nbsp 3