“你好,阿米戈!”

“你好,瑞希!”

“你现在对字符串了解得足够多了,可以学习一些有趣的东西。更具体地说,是一个与 String 类相似但不完全相同的新类。”

“听起来很有趣,但我并不完全清楚普通字符串的不足之处以及为什么需要其他类似字符串的类。”

“让我们从字符串是 Java 中的不可变对象这一事实开始。”

“怎么样?我忘记了……或者我从来不知道……”

“让我提醒你,不可变对象是那些在创建后状态无法更改的对象。”

“啊……为什么字符串在 Java 中是不可变的?”

“这样做是为了使 String 类高度优化并允许它在任何地方使用。例如,仅建议将不可变类型用作 HashMap 集合中的键

“然而,当程序员发现 String 类是可变的更方便时,经常会出现这样的情况。他们想要一个在每次调用其方法之一时都不会创建新子字符串的类。”

“可是它有什么用呢?”

“好吧,假设我们有一个非常大的字符串,我们需要经常在它的末尾添加一些东西。在这种情况下,即使是字符集合 ( ArrayList<Character>) 也比不断重新创建和连接 String 对象更有效率。”

“这就是为什么我们需要不完全是 String 类的字符串?”

” 正是。Java 语言增加了一个类 String 类型,可以改变。它被称为StringBuilder“。

创建对象

StringBuilder“要基于现有字符串创建对象,您需要执行如下语句:

StringBuilder name = new StringBuilder(string);

“要创建一个空的可变字符串,您需要使用如下语句:

StringBuilder name = new StringBuilder();

方法列表

“该StringBuilder课程有两打有用的方法。以下是最重要的方法:

方法 描述
StringBuilder append(obj)
将传递的对象转换为字符串并将其附加到当前字符串
StringBuilder insert(int index, obj)
将传递的对象转换为字符串并插入到当前字符串的中间
StringBuilder replace(int start, int end, String str)
用传递的字符串替换 start..end 间隔指定的字符串部分
StringBuilder deleteCharAt(int index)
从字符串中删除具有指定索引的字符
StringBuilder delete(int start, int end)
从字符串中删除指定间隔内的字符
int indexOf(String str, int index)
在当前字符串中搜索子字符串
int lastIndexOf(String str, int index)
在当前字符串中搜索子字符串,从末尾开始
char charAt(int index)
返回字符串中传递的索引处的字符
String substring(int start, int end)
返回指定区间定义的子字符串
StringBuilder reverse()
反转当前字符串。
void setCharAt(int index, char)
将指定索引处的字符更改为传递的字符
int length()
返回字符串的字符长度

“现在我将向您简要介绍这些方法中的每一种。

附加到字符串

“要向可变字符串 ( ) 添加内容StringBuilder,请使用该append()方法。示例:

代码 描述
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

转换为标准字符串

"要将StringBuilder对象转换为 String 对象,只需调用其toString()方法即可。示例

代码 输出
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

如何删除角色?

"要删除可变字符串中的字符,您需要使用该deleteCharAt()方法。示例:

代码 输出
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

如何用另一个字符串替换字符串的一部分?

“为此有replace(int begin, int end, String str)方法。示例:

代码 输出
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello!w

“听起来很方便。谢谢你,Rishi。”

“别提了,这样吧,你能把一根绳子倒过来吗?你会怎么做?”

“好吧......我会创建一个StringBuilder,在其中放入一个字符串......然后创建一个新字符串,并在从最后一个字符到第一个字符的循环中......或者可能是按位移位......

“不错。但它可能会更快。有一种特殊的方法可以做到这一点——reverse();示例:

代码 输出
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

“除了StringBuilderclass 之外,Java 还有一个类似字符串的类,叫做StringBuffer. 它是 class 的类似物StringBuilder,但是它的方法用修饰符标记synchronized。”

“这意味着什么?”

“这意味着StringBuffer可以从多个线程同时访问该对象。”

“我对线程还不是很熟悉。但是‘可以从多线程访问’显然比‘不能从多线程访问’好……为什么不总是使用呢?StringBuffer

“因为它比 慢得多。当你开始积极探索Java 多线程StringBuilder任务中的多线程时,你可能需要这样一个类。

“我会把它写在我的记忆中,以免忘记。标记为‘为了未来’。