String与StringBuffer和StringBuilder的区别

String与StringBuffer和StringBuilder的区别

原文:Difference between String and StringBuffer and StringBuilder
本文主要关注String类的基本功能,然后会比较String与StringBuffer和StringBuilder的区别。

String类

  • String类表示字符串,可以通过两种方式实例化String类。如下所示:
    String str = “abc”; or String str = new String (“abc”);
  • 字符串在java中是不可变的,因此它是线程安全的或在函数之间共享。
  • 当我们使用双引号创建一个字符串时,首先在字符串常量池中查找是否有相同值的字符串,如果发现则返回其引用,否则它会在池中创建一个新的字符串,然后返回新字符串的引用。这样,JVM通过在不同线程中使用相同的字符串来节省大量空间。但是如果使用new运算符,它会在堆内存中显式创建一个新的String类。
  • +运算符用于连接两个字符串。然而在Java内部是通过StringBuffer来实现该操作的。
  • String类覆盖了equals()和hashCode()方法,两个字符串只有在它们具有相同顺序的相同字符时才相等。注意,equals()方法区分大小写,因此如果不区分大小写应该使用equalsIgnoreCase()方法。
  • Java中Sring类表示以UTF-16编码的字符串。
  • String类是由final修饰的,所有字段都是final的,除了“private int
    hash”,此字段包含hashCode()函数值,并且仅在调用hashCode()方法时创建,然后缓存在此字段中。此外,哈希码存储在final修饰的字符串中,因此每次调用hashCode()方法时,都会有相同的输出。对于调用者来说好像每次都会计算哈希值,然而在内部哈希值已经被缓存在hash字段中。

String类和StringBuffer的不同

因为String类是不可变的,所以当我们执行诸如concat,substring等字符串操作时,都会会生成一个新的String对象,并丢弃旧的String对象便于垃圾回收。

这些操作会占用很多资源,在堆中产生大量的垃圾。所以Java提供了用于字符串操作的StringBuffer和StringBuilder类。

StringBuffer和StringBuilder是可变对象,为字符串操作提供了append(),insert(),delete()和substring()等方法。

StringBuffer和StringBuilder的区别

Java 1.4以前,只有StringBuffer可以使用,但它有一个缺点,其所有的公共方法都是同步的。 StringBuffer是线程安全的,但性能成本却比较高。

在多数情况下,我们不在多线程环境中使用String类,因此从Java 1.5开始引入了一个和StringBuffer几乎相同的新类,即StringBuilder,但它不是线程安全的。

所以如果你在单线程环境中或者不关心线程安全,你应该使用StringBuilder,否则就使用StringBuffer。

String vs StringBuffer vs StringBuilder

  • String是不可变的,而StringBuffer和StringBuider是可变类。
  • StringBuffer是线程安全并且同步的,而StringBuilder不是,这就是为什么StringBuilder比StringBuffer更快。
  • String类的+运算符在内部使用StringBuffer或StringBuilder类实现的。
  • 对于非多线程环境中的字符串操作,我们应该使用StringBuilder,否则就使用StringBuffer类。

以上就是String、StringBuffer、StringBuilder之间的差异的简单总结。在大多数字符串操作中,StringBuilder比StringBuffer更适合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值