android每日面试题6之String、StringBuilder、StringBuffer 区别

我擦,我要放弃了吗,今天才是第六道题啊。不能,现在赶紧补上。

我之前知道: 

String,StringBuffer字符串用的还是挺多的, StringBuilder我还是用的比较少。他们之间的区别是什么,string好像都是常量用多了比较消耗内存。像大量需要拼接的字符串就用StringBuffer.StringBulider也是拼接字符串。他们俩之间的区别就是StringBuffer是线程安全的,StringBuilder是线程不安全的。好像我就是知道这么多,至于为什么不安全,我赶紧查查资料去🤦‍♂️。

  一.String

String str = "hi";

public void main(int[] array){

  str = str + "zhaolei";
}

  这一段代码你知道耗费了多少内存吗? 初始化赋值一次“hi”在内存中开辟了一段,然后"zhaolei"这个字符串又开辟了一个内存。最后组成“hi zhaolei” 开辟了新的一段内存空间。简单的一次拼接字符串耗费了三段内存空间。是极大浪费的,遇到这种我们应该使用stringbuffer或者stringbulider进行拼接字符串。为什么stringbuffer/stringbulider就不耗费内存,他是怎么做的?

  二.StringBuffer

   

   可以看到我们最常用的方法,点进去调用了父类的append方法再进去看看!!

进去之后找到这个方法,判断是否为空,然后获取字符串字符。看看 ensureCapacityInternal()做了什么。

这是一个数组的扩容吧。保存value里面。value是个char数组。原来他都保存到一个char数组不是一个string里面了。

so 应该消耗内存比较小吧。

tostring()方法是重新实例了一个字符串对象。而且为什么是线程安全的,看到方法 synchronized关键字修饰。

 三.StringBuilder

他也是直接使用了父类的append方法

stringbulider也是一个cha数组,都是一样的诶,他们到底差在哪里了呢❓发现stringbuilder的append()方法是没有带synchronized方法的所以他应该不是线程安全的。

一个可变的字符序列。StringBuilder类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现种,它比StringBuffer要快。

String:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间.

StringBuffer:StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量.

StringBulider:与StringBulider兼容只是速度更快,但是线程不安全。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值