Java 中 String, StringBuffer 和 StringBuilder 的不同
在篇文章中,我们将讨论 Java String、StringBuffer 和 StringBuilder 之间的区别。
String 类
String 类表示字符串。 Java 程序中的所有字符串文字,例如“jiyik”,都是作为此String类的实例来实现的。 字符串是常量; 它们的值在创建后无法更改。
StringBuffer
StringBuffer 是线程安全的、可变的字符序列。 StringBuffer 和 String 类似,但可以修改。
在任何时间点,它都包含一些特定的字符序列,但是序列的长度和内容可以通过某些方法调用来改变。
StringBuffer 可以安全地被多个线程使用。
StringBuilder
StringBuilder 是可变的字符序列。 该类提供与 StringBuffer 兼容的 API,但不保证同步。
StringBuilder 类设计的目的是用于在单个线程正在使用 StringBuffer 的地方(通常情况下)作为它的替代品。
在可能的情况下,建议优先使用 StringBuilder 类而不是 StringBuffer,因为它的性能在大多数的情况下要更高。
让我们比较一下 String、StringBuffer 和 StringBuilder 的所有特性,如下表:
特性 | String | StringBuffer | StringBuilder |
---|---|---|---|
Thread safe? | Yes | Yes | No |
Synchronized? | Yes | Yes | No |
Modifiable? | No (immutable) | Yes (mutable) | Yes (mutable) |
Storage | String Pool | Heap | Heap |
Performance | Slow | Fast | Faster |
Java 代码示例
在本教程中,我们添加、追加字符串总计 199999 次。
/**
* @author jiyik.com
* Program: Java 中 String, StringBuffer 和 StringBuilder 的不同
*/
public class StringVsStringBufferVsStringBuilder {
public static void main(String[] args) {
String crunchifyString = "";
long crunchifyBefore = System.currentTimeMillis();
for (int i = 0; i < 199999; i++) {
crunchifyString = crunchifyString + "jiyik.com";
}
long crunchifyAfter = (System.currentTimeMillis());
crunchifyPrint("Task Completion Time for String: " + (crunchifyAfter - crunchifyBefore));
crunchifyBefore = System.currentTimeMillis();
StringBuffer crunchifyStringBuffer = new StringBuffer();
for (int i = 0; i < 199999; i++) {
crunchifyStringBuffer.append("jiyik.com");
}
crunchifyAfter = (System.currentTimeMillis());
crunchifyPrint("Task Completion Time for StringBuffer: " + (crunchifyAfter - crunchifyBefore));
crunchifyBefore = System.currentTimeMillis();
StringBuilder crunchifyStringBuilder;
crunchifyStringBuilder = new StringBuilder();
for (int i = 0; i < 199999; i++) {
crunchifyStringBuilder.append("jiyik.com");
}
crunchifyAfter = (System.currentTimeMillis());
crunchifyPrint("Task Completion Time for StringBuilder: " + (crunchifyAfter - crunchifyBefore));
}
private static void crunchifyPrint(String s) {
System.out.println(s);
}
}
在 IntelliJ IDEA 或 Eclipse 控制台中将上述程序作为 Java 应用程序运行,将得到如下结果。
/Users/app/app/Installation/jdk-17.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=50109:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath :/Users/app/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.32/log4j-over-slf4j-1.7.32.jar crunchify.com.tutorial.CrunchifyStringVsStringBuffer
Task Completion Time for String: 19648
Task Completion Time for StringBuffer: 7
Task Completion Time for StringBuilder: 3
Process finished with exit code 0
如果在上面的程序运行时遇到任何问题,或者在 String、StringBuffer 和 StringBuilder 之间有任何问题,请留言讨论。
相关文章
在 Java 中获取文件大小
发布时间:2023/05/01 浏览次数:139 分类:Java
-
Java 提供了不同的方法来获取文件的字节大小。 本教程演示了在 Java 中获取文件大小的不同方法。使用 Java IO 的文件类获取文件大小 Java IO 包的 File 类提供了以字节为单位获取文件大小的功能。
Java 中的文件分隔符
发布时间:2023/05/01 浏览次数:108 分类:Java
-
本篇文章介绍了 Java 中的文件分隔符。Java 中的文件分隔符 文件分隔符是用来分隔目录的字符; 例如,Unix 使用 /,Windows 使用 \ 作为文件分隔符。
Java 中的文件过滤器
发布时间:2023/05/01 浏览次数:193 分类:Java
-
本篇文章介绍如何在 Java 中使用 FileFilter。FileFilter 用于过滤具有特定扩展名的文件。 Java内置包IO和Apache Commons IO为FileFilter提供了类和接口来进行文件过滤操作。
Java 获取 ISO 8601 格式的当前时间戳
发布时间:2023/05/01 浏览次数:132 分类:Java
-
本篇文章介绍了 ISO 8601 日期格式、其重要性及其在 Java 中的使用。 它还列出了一些优点来强调为什么应该使用 ISO 格式来表示日期。
在 Java 中获取数组的子集
发布时间:2023/05/01 浏览次数:142 分类:Java
-
本篇文章介绍了几种在 Java 中获取数组子集的方法。使用 Arrays.copyOf() 方法获取数组的子集 使用 Arrays.copyOfRange() 方法获取数组的子集
用 Java 填充二维数组
发布时间:2023/05/01 浏览次数:110 分类:Java
-
二维数组是基于表结构的,即行和列,填充二维数组不能通过简单的添加到数组操作来完成。 本篇文章介绍如何在 Java 中填充二维数组。
计算 Java 数组中的重复元素
发布时间:2023/05/01 浏览次数:202 分类:Java
-
本篇文章介绍Java计算数组中重复元素的方法。计算 Java 数组中的重复元素。我们可以创建一个程序来计算数组中的重复元素。 该数组可以是未排序的,也可以是已排序的。
Java 中 List 和 Arraylist 的区别
发布时间:2023/05/01 浏览次数:90 分类:Java
-
表示为单个单元的一组单个对象称为集合。 在 Java 中,Collection 是一个具有多个已定义接口和类的框架,用于将一组对象表示为一个单元。 它允许我们操纵