String与StringBuilder以及StringBuffer的比较

这个是写给自己的学习笔记,如果对你有帮助的话请点赞,如果没有的话请不要喷,毕竟是菜鸟一枚

        看过很多写关于这三者的比较,结合自己的想法写下这篇文章。

首先的话String,StringBuilder和StringBuffer都是和字符串有关的类,它们存储字符串的变量都是一个字符数组,它们都可以创建字符串和操作字符串,这些是它们之间的共性。

三者之间的主要区别在于:

         String是字符串常量,其值一旦定义就无法改变,而StringBuilder和StringBuffer都是可变的字符序列,其字符串的内容可以改变;StringBuilder与StringBuffer的区别在于StringBuilder是非线程安全的,而StringBuffer是线程安全的。

源码分析:

        查看String的源码我们可以看到,String是一个final类无法被继承,其存储字符串的字符数组使用private final修饰,private final char value[];使用final修饰的引用类型的变量无法改变其引用的对象,其次该字符数组使用 private修饰,我们无法通过对象.属性来改变其数组里面的值,而且String类也没有提供set和get方法来修改其值,因此一旦String对象初始化,那么其字符序列是无法改变的。而StringBuilder和StringBuffer从AbstractStringBuilder类继承一个字符数组,其源码为char[] value,可以看出该变量是可以被修改的,因此它们都是可变字符序列。通过append和insert方法,我们可以很方便地修改字符序列。

        另外很多初学者会认为String对象是可变的,String a = "before"; a = "later",看起来String对象的值改变了,但仔细分析我们会发现改变的是变量a,而不是之前的"before"字符串对象,上面的代码只是将a的引用重新指向了"later"字符串对象,而原来的"before"字符串对象并未改变。

        查看StringBuilder和StringBuffer的源码会发现,它们大部分的变量和方法都是类似的,区别在于StringBuffer的大部分方法是同步方法,使用synchronized关键字修饰,如:public synchronized StringBuffer append(String str),public StringBuilder append(String str),因此StringBuilder是线程不安全的StringBuffer是线程安全的,但是StringBuffer的效率较低,三者之间效率的比较:StringBuilder>String>StringBuffer。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值