java-学习之路-String和StringBuild和StringBuffer的区别

从表层分析就一句话.

String 里面的value[]数组不可改变, StringBulid和StringBuffer里面value[]数组可以改变.

具体原因为:

  1. String 里面的value[]被定义为private fainal char[]value;fainal的特性保证了value只可以被初始化一次,然后就不可以改变.
  2. 而且value的可见性是private的,私有属性的特性为,只有在同一个类中能够访问,其他的任何的都不可访问的到,也就避免了在其他地方被修改的可能性.
  3. StringBulid和StringBuffer的内部char[]value是没有可见性修饰的,也就是可见性为默认状态,这种状态可以被同一个包下的其他类访问, 最关键的是其并未设定final关键字,所以这个数组可以被修改

为什么可以有string str1 = "abc"; str1 = "xyz";这种操作呢, 这里貌似看起来是修改了String中char value[]的值,但是实际上并不是,只是str1这个引用被重新赋值了, 他指向了新的字符串对象"xyz"; 形如str1 = str1+ ''op";这种操作,执行后str1中value[]中存放的变为"abcop";但是其实是重新创建了一个新的字符串对象,并将这个字符串对象的引用赋值给str1;

 

而StringBuffer和StringBuild两个类可以修改value数组,所以他们的效率要比string要高一些,因为string需要不断创建新的对象并且对这些对象进行管理, StringBuffer和StringBuild在初始化构造value数组时,会创建一个比所需内存空间大32字节(16个char类型)的内存块.当对value数组进行修改,比如增加操作时,会优先检查当前value数组是否能够满足所需的最小空间, 假如不足就进行扩容,每次扩容都是2capacity + 2这种方式如 17->36->74....

stringBuffer和stringBuild区别在于线程安全性问题, stringBuffer是线程安全的, StringBuild是线程不安全的,但是不安全的效率高啊哈哈.

所以进行少量字符串操作可以使用String, 大量字符串单线程使用StringBuild, 大量字符串多线程(需要考虑线程安全)使用StringBuffer

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值