别再问我它们有啥区别了

玩代码,玩技术,可以关注我的微信公众号:果冻想

以“技”服人

管理一个以年轻人为主的技术团队,一方面要在管理方式上下功夫,而另一方面更需要以“技”服人。如果作为一个技术团队的老大,你胸无点墨,总是被团队成员的技术问题难倒,那就算你管理方式再厉害,在大家心中,你还是不能赢得大家的尊重。

所以作为基层技术团队的负责人,一定要在技术方面能领导这个团队,能在技术方面给大家指导,这样才能“压”的住,即使你不能每个问题都能摆平,但是江湖一定要有你的大神传说。

那天在评审代码时,遇到一个字符串拼接的问题,小兄弟使用了+来实现的,我随口反问了句,为什么不使用StringBuilder

小兄弟一脸懵逼的表情,眼神中质问着我,这又显的你了?是的,我看到了他的质疑,但是我必须拿捏他。这里就将那天口头分享的内容整理成文,和大家分享。

先说结论,再说细节

现在的快节奏,很多读者只需要结论,并不在乎细节,所以先摆出结论,后续再细说细节:

  • 如果不需要频繁操作拼接或者修改字节串,直接使用String更便捷,代码更简洁;如果非要给这个频繁限定一个范围的话,我想1万以内,都是可以的
  • 如果需要频繁进行字符串拼接或者修改,并且有多个线程并发访问该字符串,则应选择使用线程安全的StringBuffer,有了安全,那就要放弃一定的性能
  • 如果频繁操作拼接或者修改,但只有单个线程访问该字节串,则StringBuilder则是最好的选择

当你说出了准确答案,你已经让别人信服了8分;如果你把细节也讲透了,那你就完全拿捏了。

String的细节

String类型,编码的兄弟肯定天天都会和它打交道,我们先来看看String类的内部定义。

别再问我它们有啥区别了_第1张图片

String类中value字段用于储存字符串的实际内容,value是一个char[]数组,并且用final修饰初始化定长度后即不可改变,这就表示value的引用地址是不可变的(但里面的元素是可变的),再加上final修饰的String类不能被继承,这就决定value数组的元素值已经无法从外部修改了,最终决定了String对象是不可变的。

String类内部,定义了一堆字符串操作函数,而这些对字符串操作的函数,都是重新定义了新的字符串进行返回,而原字符串内容并不会变更。

StringBuffer的细节

StringBuffer类在内部实现时,主要是实现了AbstractStringBuilder抽象类,在该类中,定义了
一个可char[]的数组来存放字符串,当进行append操作时,如果数组空间不够用,就会根据内定算法重新申请空间,并将原数据拷贝过来。在内部实现上,都是通过使用synchronized关键字来实现的线程安全。

通过大量使用synchronized就会不可避免的影响性能,而在StringBuffer类的内部实现上,结合多线程的读多写少的使用场景,为了提升性能,有一个实现小细节,有以下一个变量定义:

别再问我它们有啥区别了_第2张图片

字段上的解释是返回最后一次toString的缓存值,一旦StringBuffer被修改就清除这个缓存值,这里搞了这个缓存,可以平衡StringBuffer的性能。这个小细节,我们日后在开发时,可以借鉴哦。

StringBuilder的细节

StringBuilderStringBuffer的最大区别就是使用synchronized关键字实现的线程安全上,其它上面大同小异,不再纠结,有空可以去看看源代码,还是会有好多收获的。

总结

他们问孔乙己,茴香豆的茴有几种写法,但是我坚信这篇文章绝对不是一篇八股文。渐渐的,慢慢的,发现身边在乎技术细节的同事越来越少了,喜欢打磨代码的人也越来越少了,问题出在哪里?

玩代码,玩技术,可以关注我的微信公众号:果冻想

你可能感兴趣的:(java)