【Java基础教程】(三十三)常用类库篇 · 第三讲:可变字符串支持类——解析 StringBuffer与 StringBuilder类~
Java基础教程之常用类库 · 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); }
输出结果:
HelloWorldHelloHello WorldHello EverybodyydobyrevE olleHydobyrevE 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类使用:创建对象、比较、连接、截取、查找和替换、拆分…)
《【Java基础教程】(三十二)常用类库篇 · 第二讲:包装类 Wrapper Class——概念及用途, 自动装箱与拆箱,常用操作方法~》
《【Java基础教程】(三十四)常用类库篇 · 第四讲:Runtime类——API知识汇总分享,深入解析Runtime运行时环境访问支持类~》
来源地址:https://blog.csdn.net/LVSONGTAO1225/article/details/131248502
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341