String、StringBuffer 和 StringBuilder之间的区别

        String 是 Java 中最重要的类之一,任何开始 Java 编程的人都使用 String 通过使用著名的System.out.println()语句在控制台上打印一些内容。许多 Java 初学者并不知道String 在 Java 中是不可变的和最终的,并且 String 中的每次修改都会创建一个新的 String 对象。例如,当你获取子字符串时,你会得到一个新的字符串,当你将大写字符串转换为小写时,会创建一个新字符串。即使通过调用trim()方法删除空格,也会返回一个新的字符串

        所以,现在最大的问题是如何在 Java 中操作 String 而不产生 String 垃圾?StringBuilderStringBuffer就是这个问题的答案。StringBuffer是一个旧类,但StringBuilder是 Java 5 中新添加的,并且对Java 中的EnumGenericsvarargs 方法和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. 不可变
        Java 中的字符串是不可变的:Java 中的字符串在设计上是不可变的,您可以查看 http://t.csdnimg.cn/3RFsF  了解原因。不变性为 String 类提供了很多好处,例如,它的 hashcode 值可以被缓存,这使其成为更快的 HashMap 键,这也是String 成为 HashMap 中流行键的原因之一。因为 String 是最终的,所以它可以在多个线程之间安全地共享,而无需任何额外的同步。


2. 字符串字面量
        当我们用双引号(如“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 中的字符串。 



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值