原文:http://zetcode.com/java/stringbuilder/

Java StringBuilder教程显示了如何在 Java 中使用StringBuilder。 Java String对象是不可变的。 只能创建原始字符串的修饰副本。 当我们需要就地修改字符串时,可以使用StringBuilder

StringBuilder

StringBuilder是可变的字符序列。 当我们想就地修改 Java 字符串时,使用StringBuilderStringBuffer是类似于StringBuilder的线程安全等效项。

StringBuilder具有允许修改字符串的方法,例如append()insert()replace()

Java StringBuilder构造器

StringBuilder具有四个构造器:

构造器 描述
StringBuilder() 创建一个初始容量为 16 个字符的空字符串构建器
StringBuilder(CharSequence seq) CharSequence创建一个字符串生成器
StringBuilder(int capcity) 用指定的首字母创建一个空的字符串生成器
StringBuilder(String str) 从指定的字符串创建字符串生成器

Java StringBuilder是可变的

Java String是不可变的,而StringBuilder是可变的。

MutableImmutableEx.java

  1. package com.zetcode;
  2. public class MutableImmutableEx {
  3. public static void main(String[] args) {
  4. var word = "rock";
  5. var word2 = word.replace('r', 'd');
  6. System.out.println(word2);
  7. var builder = new StringBuilder("rock");
  8. builder.replace(0, 1, "d");
  9. System.out.println(builder);
  10. }
  11. }

该示例演示了StringStringBuilder之间的主要区别。

  1. var word2 = word.replace('r', 'd');

Java String具有replace()方法,但它不会修改原始字符串。 而是创建修改后的副本。

  1. var builder = new StringBuilder("rock");
  2. builder.replace(0, 1, "d");

另一方面,StringBuilder替换字符串。

  1. dock
  2. dock

这是输出。

Java StringBuilder附加方法

StringBuilder包含几个重载append()方法,它们在字符串的末尾添加一个值。

StringBuilderEx.java

  1. package com.zetcode;
  2. import java.util.stream.LongStream;
  3. public class StringBuilderAppendEx {
  4. private final static long MAX_VAL = 500;
  5. public static void main(String[] args) {
  6. var builder = new StringBuilder();
  7. var sum = LongStream.rangeClosed(0, MAX_VAL).sum();
  8. LongStream.rangeClosed(1, MAX_VAL).forEach(e -> {
  9. builder.append(e);
  10. if (e % 10 == 0) {
  11. builder.append("\n");
  12. }
  13. if (e < MAX_VAL) {
  14. builder.append(" + ");
  15. } else {
  16. builder.append(" = ");
  17. }
  18. });
  19. builder.append(sum);
  20. System.out.println(builder);
  21. }
  22. }

该示例从数百个小字符串中构建一个大字符串。 字符串的格式如下:1 + 2 + 3 + ... + MAX_VAL = SUM

  1. var builder = new StringBuilder();

空的StringBuilder被创建。

  1. LongStream.rangeClosed(1, MAX_VAL).forEach(e -> {

将创建一个值范围1..MAX_VAL。 我们使用forEach()方法迭代这些值。

  1. builder.append(e);

我们使用append()方法将当前值附加到字符串生成器。

  1. if (e % 10 == 0) {
  2. builder.append("\n");
  3. }

为了使输出适合屏幕,我们在每十个值之后添加一个换行符。

  1. if (e < MAX_VAL) {
  2. builder.append(" + ");
  3. } else {
  4. builder.append(" = ");
  5. }

在这些值之间,我们添加+"="字符。

  1. builder.append(sum);

在字符串的末尾,我们添加值的总和。

  1. System.out.println(builder);

最后,字符串被打印到控制台。

StringBuilder插入方法

insert()方法用于将字符串插入构建器的指定位置。

StringBuilderInsertEx.java

  1. package com.zetcode;
  2. public class StringBuilderInsertEx {
  3. public static void main(String[] args) {
  4. var sentence = "There is a red fox in the forest.";
  5. var builder = new StringBuilder(sentence);
  6. builder.insert(19, "and a wolf ");
  7. System.out.println(builder);
  8. }
  9. }

该示例使用insert()方法将字符串插入句子中。

  1. There is a red fox and a wolf in the forest.

我们创建了这句话。

获取子字符串的索引

indexOf()方法返回第一次出现的子字符串,而lastIndexOf()方法返回最后出现的子字符串。

StringBuilderIndexesEx.java

  1. package com.zetcode;
  2. public class StringBuilderIndexesEx {
  3. public static void main(String[] args) {
  4. var builder = new StringBuilder();
  5. builder.append("There is a wolf in the forest. ");
  6. builder.append("The wolf appeared very old. ");
  7. builder.append("I never saw a wild wolf in my life.");
  8. var term = "wolf";
  9. int firstIdx = builder.indexOf(term);
  10. int firstIdx2 = builder.indexOf(term, 15);
  11. System.out.format("First occurrence of %s %d%n", term, firstIdx);
  12. System.out.format("First occurrence of %s %d%n", term, firstIdx2);
  13. int lastIdx = builder.lastIndexOf(term);
  14. int lastIdx2 = builder.lastIndexOf(term, 15);
  15. System.out.format("Last occurrence of %s %d%n", term, lastIdx);
  16. System.out.format("Last occurrence of %s %d%n", term, lastIdx2);
  17. System.out.println(builder);
  18. }
  19. }

该示例使用indexOf()lastIndexOf()方法来获取"wolf"子字符串的索引。

  1. var builder = new StringBuilder();
  2. builder.append("There is a wolf in the forest. ");
  3. builder.append("The wolf appeared very old. ");
  4. builder.append("I never saw a wild wolf in my life.");

我们使用append()方法创建一个字符串生成器。

  1. int firstIdx = builder.indexOf(term);

我们从生成器中首次获得"wolf"一词。

  1. int firstIdx2 = builder.indexOf(term, 15);

从索引 15 开始,我们从构建器中首次获得"wolf"术语。

  1. int lastIdx = builder.lastIndexOf(term);
  2. int lastIdx2 = builder.lastIndexOf(term, 15);

同样,我们获得"wolf"子字符串的最后一次出现。

  1. First occurrence of wolf 11
  2. First occurrence of wolf 35
  3. Last occurrence of wolf 78
  4. Last occurrence of wolf 11
  5. There is a wolf in the forest. The wolf appeared very old. I never saw
  6. a wild wolf in my life.

这是输出。

StringBuilder替换方法

replace()方法用指定的新字符串替换字符串生成器中的子字符串。

StringBuilderReplaceEx.java

  1. package com.zetcode;
  2. public class StringBuilderReplaceEx {
  3. public static void main(String[] args) {
  4. var sentence = "I saw a red fox running into the forest.";
  5. var builder = new StringBuilder(sentence);
  6. var term = "fox";
  7. var newterm = "dog";
  8. int idx = builder.indexOf(term);
  9. int len = term.length();
  10. builder.replace(idx, idx + len, newterm);
  11. System.out.println(builder);
  12. }
  13. }

该示例将"fox"子字符串替换为"dog"字符串。

  1. int idx = builder.indexOf(term);

我们找到要替换的子字符串的开始索引。

  1. int len = term.length();

在我们的操作中,我们需要知道子字符串的长度。

  1. builder.replace(idx, idx + len, newterm);

我们称为replace()方法。 第一个参数是要删除的子字符串的开始索引,第二个参数是要删除的子字符串的结束索引。 第三个参数是新字符串。

StringBuilder删除字符

在字符串构建器中,有两种删除字符的方法。

StringBuilderRemoveEx.java

  1. package com.zetcode;
  2. public class StringBuilderRemoveEx {
  3. public static void main(String[] args) {
  4. var sentence = "There is a red fox in the forest.";
  5. var builder = new StringBuilder(sentence);
  6. builder.delete(11, 14);
  7. System.out.println(builder);
  8. builder.deleteCharAt(11);
  9. System.out.println(builder);
  10. }
  11. }

该示例从字符串中删除一些字符。

  1. builder.delete(11, 14);

使用delete()方法,我们删除了由索引指定的子字符串。

  1. builder.deleteCharAt(11);

使用delete()方法,我们删除一个字符; 在我们的情况下,它是多余的空格字符。

  1. There is a fox in the forest.
  2. There is a fox in the forest.

这是输出。

StringBuilder子字符串

使用substring()方法可以从字符串返回子字符串。

StringBuilderSubstringsEx.java

  1. package com.zetcode;
  2. public class StringBuilderSubstringsEx {
  3. public static void main(String[] args) {
  4. var sentence = "There is a red fox in the forest.";
  5. var builder = new StringBuilder(sentence);
  6. var word = builder.substring(15, 18);
  7. System.out.println(word);
  8. var sbstr = builder.substring(15);
  9. System.out.println(sbstr);
  10. }
  11. }

在示例中,我们检索了两个子字符串。

  1. var word = builder.substring(15, 18);

该行检索起始索引为 15 且终止索引为 18 的子字符串。

  1. var sbstr = builder.substring(15);

在这里,我们检索从索引 15 到句子结尾的子字符串。

  1. fox
  2. fox in the forest.

这是输出。

在本教程中,我们使用了 Java StringBuilder。 您可能也对相关教程感兴趣: Java 教程Java 拆分字符串教程Java 中的HashMap迭代Java ArrayList教程Java HashSet教程Java NumberFormat教程Java8 forEach教程读取 Java 文本文件用 Java 读取和编写 ICO 图像