String 是 Java 中最重要的类之一,任何开始 Java 编程的人都使用 String 通过使用著名的System.out.println()语句在控制台上打印一些内容。许多 Java 初学者并不知道String 在 Java 中是不可变的和最终的,并且 String 中的每次修改都会创建一个新的 String 对象。例如,当你获取子字符串时,你会得到一个新的字符串,当你将大写字符串转换为小写时,会创建一个新字符串。即使通过调用trim()方法删除空格,也会返回一个新的字符串
所以,现在最大的问题是如何在 Java 中操作 String 而不产生 String 垃圾?StringBuilder和StringBuffer就是这个问题的答案。StringBuffer是一个旧类,但StringBuilder是 Java 5 中新添加的,并且对Java 中的Enum、Generics、varargs 方法和Autoboxing 进行了重大改进。 无论你正在使用哪种类型的应用程序,都会发现 Java String 类的大量使用,但是如果您对应用程序进行分析,您会发现 String 是一个会产生大量垃圾的类,因为在 Java 中创建了很多临时String类。程序。在本 Java 教程中,我们将了解 Java 中的String 是什么、Java 中 String 的一些重要属性、 Java 中的StringBuffer是什么、何时在 Java 中使用StringBuffer、 Java 中的StringBuilder以及如何使用它来代替 StringBuffer、 什么Java 中 String 和 StringBuffer 以及 StringBuilder 之间的区别, 这也是一个常见的核心 Java 问题,主要是 String 与 StringBuilder 与 StringBuffer。 现在让我们从字符串开始。
Java中String、StringBuffer和StringBuilder之间的区别
在了解String 和 StringBuffer 或 StringBuilder 之间的区别之前,让我们先看看 Java 中 String 类的一些基本属性
1. 不可变
当我们用双引号(如“abcd”)表示字符串时,它们被称为字符串文字,并且字符串文字是在字符串池中创建的。当您使用相等运算符“==”比较两个字符串文字时,它会返回 true,因为它们实际上是字符串的同一实例。无论如何,在 Java 中将对象与相等运算符进行比较是不好的做法,应该始终使用equals 方法来检查相等性。
3. 字符串连接
“+”运算符是字符串的重载,用于连接两个字符串。内部“+”操作是使用StringBuffer或StringBuilder实现的。
4. 字符数组
字符串由字符数组备份并以 UTF-16 格式表示。顺带一句,这种行为可能会导致String中的内存泄漏,因为源 String 和 SubString 之间共享相同的字符数组,这会阻止源 String 被垃圾收集。
5. 平等检查
String 类重写equals()和hashcode()方法,如果两个字符串以相同的顺序和相同的大小写包含完全相同的字符,则认为它们相等。如果您想忽略两个字符串的大小写比较,请考虑使用 equalsIgnoreCase()方法。
另一个值得注意的点是equals方法必须与String的compareTo()方法一致, 因为SortedSet和SortedMap(例如TreeMap)在Java中使用compareTo方法来比较String。
7. 代表
toString()方法提供任何对象的字符串表示形式,它在 Object 类中声明,建议其他类实现此方法并提供字符串表示形式。
8、字符串在Java中使用UTF-16格式表示。
9、在Java中,你可以从字符数组、字节数组、另一个字符串、StringBuffer 或 StringBuilder
创建String。Java String 类为所有这些提供了一个构造函数。
10. 尽管所有 StringBuffer、StringBuilder 和 String 都来自相同的类型层次结构,即它们从 CharSequence 接口扩展,但您无法在 Java 中将 StringBuilder 转换为 StringBuffer 或将 StringBuilder 转换为 String。如果您尝试在 Java 中将 StringBuffer 强制转换为 String,它将抛出java.lang.ClasscastException 。 下面是一个很好的图,展示了 Java 中 StringBuffer、StringBuilder 和 String 之间的关系:
Java 中的字符串问题
如果使用不当, 它的最大优点之一就是可变性,这也是 Java String 的最大问题。很多时候我们创建一个字符串,然后对它们执行很多操作,例如将字符串转换为大写、小写、从中获取子字符串、与其他字符串连接等。
由于 String 是一个不可变类,每次创建新 String 时都会丢弃旧的 String,这会在堆中创建大量临时垃圾。如果字符串是使用字符串文字创建的,它们将保留在字符串池中。为了解决这个问题,Java 为我们提供了两个类:StringBuffer 和 StringBuilder。String Buffer 是一个较旧的类,但 StringBuilder 相对较新,是在 JDK 5 中添加的。
Java中String和StringBuffer的区别
String 和 StringBuffer 之间的 主要区别是String是不可变的,而StringBuffer是可变的,这意味着您可以在创建StringBuffer对象后对其进行修改,而无需创建任何新对象。这种可变属性使StringBuffer成为在 Java 中处理字符串的理想选择。你可以通过其toString()方法将StringBuffer转换为String。
Java中StringBuilder和StringBuffer的区别
StringBuffer对于可变字符串非常有用,但它有一个缺点,它的所有公共方法都是同步的,这使得它是线程安全的,但同时速度很慢。在 JDK 5 中,他们在 Java 中提供了一个名为 StringBuilder 的类似类,它是 StringBuffer 的副本,但没有同步。尽可能尝试使用StringBuilder,它在大多数情况下比 StringBuffer 类表现更好。
你还可以使用“+”来连接两个字符串,因为“+”操作是在 Java 中使用 StringBuffer 或 StringBuilder内部实现的。如果您查看 StringBuilder 与 StringBuffer,您会发现它们完全相同,并且所有适用于 StringBuffer 的 API 方法也适用于 Java 中的 StringBuilder。
另一方面,String 与 StringBuffer完全不同,它们的 API 也完全不同,StringBuilder 与 String 也是如此。下面是 Java 中 StringBuffer 和 StringBuilder 之间区别的一个很好的总结:
概括
总之,这里列出了 Java 中 StringBuffer、String 和 StringBuilder 之间的差异:
1. Java中String对象是不可变的,但StringBuffer和StringBuilder是可变对象。
2. StringBuffer是同步的,而StringBuilder不是,这使得StringBuilder比StringBuffer更快。
3. 连接运算符“+”在内部使用StringBuffer 或StringBuilder 实现。
4、如果需要不变性就使用String ,如果需要可变+线程安全就使用java中的StringBuffer ,如果需要可变+无线程安全就使用Java中的StringBuilder。
这就是著名的String 与 StringBuffer或StringBuffer 与 StringBuilder的讨论。所有这些差异都有助于避免在许多地方使用 String 代替 StringBuffer 的常见编码错误。从 Java 5 开始,可以使用 StringBuilder 的 + 运算符来连接 Java 中的字符串。