theme: healer-readable
highlight: a11y-dark
哈喽,各位小伙伴们,你们好呀,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java中,字符串是一种不可变的数据类型,也就是说,一旦创建了该字符串,就无法对其进行修改。但是,在实际开发中,我们常常需要对字符串进行拼接,删除和替换等操作。这就需要一个可以动态修改字符串的类。
摘要
StringBuilder类可以理解为一个字符串缓冲区,它提供一个可变的字符序列,可以在该序列上进行修改操作,比如追加,插入,删除和替换等。与String类不同的是,String类的修改操作每次都会创建一个新的字符串对象,而StringBuilder类的修改操作都是在原有的字符序列上进行的,不会创建新的对象,因此在频繁进行字符串操作时,StringBuilder类的效率比String类高。
StringBuilder类
简介
StringBuilder类位于Java.lang包中,是一个可变字符串类,它继承于AbstractStringBuilder类,实现了CharSequence, Appendable, Serializable等接口。StringBuilder的主要作用是用来处理字符串,提供一系列的操作方法,包括追加,插入,删除和替换等。StringBuilder类适用于构建字符串的场景,可以提高字符串的操作效率。
源代码解析
下面是StringBuilder类的源代码:
代码语言:java复制public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/**
* 构造一个不带任何字符初始容量为16的StringBuilder
*/
public StringBuilder() {
super(16);
}
/**
* 构造一个带有指定初始容量的StringBuilder
*
* @param capacityBuilder的初始容量
* @throws NegativeArraySizeException 如果capacity为负数
*/
public StringBuilder(int capacity) {
super(capacity);
}
/**
* 构造一个StringBuilder,它包含与指定的CharSequence相同的字符序列
*
* @throws NullPointerException 如果seq为null
*/
public StringBuilder(CharSequence seq) {
this(seq.length() 16);
append(seq);
}
/**
* 构造一个StringBuilder,它包含与指定的String相同的字符序列
*
* @throws NullPointerException 如果str为null
*/
public StringBuilder(String str) {
this(str.length() 16);
append(str);
}
}
可以看到,StringBuilder类提供了多个构造方法,可以根据不同的场景选择不同的构造方法来创建StringBuilder对象。
StringBuilder类是一个可变的字符串,允许进行多次修改而不创建新的String对象。它是AbstractStringBuilder类的子类,实现了CharSequence接口和java.io.Serializable接口。
该类定义了四个构造函数,分别为不带参数的构造函数、指定初始容量的构造函数、包含CharSequence的构造函数和包含String的构造函数。其中,不带参数的构造函数会创建一个长度为16的StringBuilder对象。指定初始容量的构造函数会根据参数capacity创建一个StringBuilder对象。包含CharSequence的构造函数和包含String的构造函数会创建一个容量为参数长度加16的StringBuilder对象,并将参数序列追加到StringBuilder对象末尾。
如果capacity参数为负数,则会抛出NegativeArraySizeException异常。如果seq或str参数为null,则会抛出NullPointerException异常。
如下是部分源码截图:
应用场景案例
以下是一些使用StringBuilder类的场景:
- 字符串拼接
public class StringBuilderTest {
//测试字符串拼接
public static void testAppend() {
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("world!");
System.out.println(sb.toString()); //result = "Hello world!"
}
public static void main(String[] args) {
testAppend();
}
}
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
- 替换操作
//测试替换操作
public static void testReplace() {
StringBuilder sb = new StringBuilder("The quick brown fox jumps over the lazy dog.");
sb.replace(4, 9, "slow");
System.out.println(sb.toString()); // sb = "The slow brown fox jumps over the lazy dog."
}
public static void main(String[] args) {
testReplace();
}
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
- 删除操作
//测试删除操作
public static void testDelete() {
StringBuilder sb = new StringBuilder("The quick brown fox jumps over the lazy dog.");
sb.delete(4, 9);
System.out.println(sb.toString()); // sb = "The brown fox jumps over the lazy dog."
}
public static void main(String[] args) {
testDelete();
}
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
如下还有几个操作,我就留给同学们自行测试玩耍啦,这里就不一一赘述啦。
- 插入操作
StringBuilder sb = new StringBuilder("The brown fox jumps over the lazy dog.");
sb.insert(4, "quick "); // sb = "The quick brown fox jumps over the lazy dog."
- 反转操作
StringBuilder sb = new StringBuilder("hello");
sb.reverse(); // sb = "olleh"
优缺点分析
优点:
- StringBuilder类是可变的,可以在原有的字符序列上进行修改操作,避免了每次操作都创建新对象的问题。
- StringBuilder类提供了多种操作方法,可以方便地进行字符串拼接,删除,替换等操作。
- StringBuilder类的效率比String类高,特别是在频繁进行字符串操作时表现更加突出。
缺点:
- StringBuilder类不是线程安全的,如果有多个线程同时对同一个StringBuilder对象进行操作,可能会出现并发问题。
- StringBuilder类无法直接进行比较操作,必须先转换成String类型才能进行比较。
类代码方法介绍
以下是StringBuilder类的常用方法:
- append()方法:将指定的字符串或字符追加到此序列的末尾。
- replace()方法:用指定的字符串替换此序列中在指定位置范围内的子字符串。
- delete()方法:从此序列中删除从 start 开始到 end - 1 结束的字符。
- insert()方法:将指定的字符串或字符插入此序列中。
- reverse()方法:返回一个新的StringBuilder对象,它是此序列的一个倒序排列。
- toString()方法:将此序列用字符串表示形式返回。
测试用例
以下是一个测试用例,用于测试StringBuilder类的基本功能:
测试代码演示
代码语言:java复制package com.example.javase.se.classes;
/**
* @Author ms
* @Date 2023-11-02 18:25
*/
public class StringBuilderDemo {
public static void main(String[] args) {
testAppend();
testReplace();
testDelete();
testInsert();
testReverse();
}
public static void testAppend() {
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("world!");
System.out.println(sb.toString());
}
public static void testReplace() {
StringBuilder sb = new StringBuilder("The quick brown fox jumps over the lazy dog.");
sb.replace(4, 9, "slow");
System.out.println(sb.toString());
}
public static void testDelete() {
StringBuilder sb = new StringBuilder("The quick brown fox jumps over the lazy dog.");
sb.delete(4, 9);
System.out.println(sb.toString());
}
public static void testInsert() {
StringBuilder sb = new StringBuilder("The brown fox jumps over the lazy dog.");
sb.insert(4, "quick ");
System.out.println(sb.toString());
}
public static void testReverse() {
StringBuilder sb = new StringBuilder("hello");
sb.reverse();
System.out.println(sb.toString());
}
}
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
测试代码分析
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
根据如上内容写一段总结
如上测试用例是一个Java类StringBuilderDemo,包含了5个静态方法,分别是testAppend、testReplace、testDelete、testInsert和testReverse。
testAppend方法通过StringBuilder类的append方法向一个空StringBuilder对象中追加了两个字符串,最后输出StringBuilder中的字符串。
testReplace方法通过StringBuilder类的replace方法替换了一段字符串,从第4个字符(下标从0开始)到第9个字符之间的内容替换为"slow",最后输出StringBuilder中的字符串。
testDelete方法通过StringBuilder类的delete方法删除了一段字符串,从第4个字符到第9个字符之间的内容被删除,最后输出了StringBuilder中的字符串。
testInsert方法通过StringBuilder类的insert方法向字符串中插入了一段内容,在第4个字符的位置插入了"quick ",最后输出StringBuilder中的字符串。
testReverse方法通过StringBuilder类的reverse方法将字符串反转,最后输出StringBuilder中的字符串。
全文小结
StringBuilder类是Java中一个重要的字符串操作类,它提供了多种操作方法,可以方便地进行字符串操作。与String类不同的是,StringBuilder类是可变的,可以在原有的字符序列上进行修改操作,避免了每次操作都创建新对象的问题。但是,StringBuilder类不是线程安全的,如果有多个线程同时对同一个StringBuilder对象进行操作,可能会出现并发问题。因此,在多线程环境下应该使用StringBuffer类代替StringBuilder类。
总结
在实际开发中,对字符串进行操作是很常见的需求。使用StringBuilder类可以提高字符串的操作效率,避免了频繁创建新对象的问题。因此,在需要进行字符串操作的场景中应该优先选择使用StringBuilder类。同时,也要注意StringBuilder类的线程安全问题,根据具体的场景选择合适的类来操作字符串。
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
***
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!