上周加班,这周依然如此(今天早上还真是冷,冬天真的来了...)
StringBuffer和StringBuilder相信筒子们都了解的比较透彻
1.为什么要写?
在弄convert Object to Json的时候,无意看了下json的sourcecode,发现它用的是StringBuilder, 思绪一下子就回到了刚毕业的青葱岁月。
还记得那时还很年轻,青春就如同奔流的江河,而现在青春,一去不回 来不及道别,只剩下麻木的我 没有了当年的热血。
当时奔波面试,狂背网上down的试题,比较经典的就是String、StringBuffer、StringBuilder的区别,因为没有具体应用,所以总是背完过不了几天就forgot了。面试的时候总会说:String是不可变的,StringBuffer是可变+thread-safe,StringBuilder是可变+thread-unsafe的。如果再深问一句,我肯定说不出the rootcause.
工作了几年,也看了一些书籍文章和source,从上面的场景总结下
code:
(1)String之所以不可变,String.class is final 并且它的变量都是final的
public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ private final char value[]; }
上面这一行的code,我随便联想一下:
(a) final这个keyword其实是可以引申出很多的知识点的.比如final修饰的方法,修饰的类,修饰的变量都有什么限制?final修饰的方法能不能被override?final修饰的东西放在JVM中什么area里? 是young,old or permanent?
(b) String其实也是由字符数组搞定的, 看看数组的概念是so foundational(you can do everything by array and reference)
(c) implements Serializable interface, 不多说,也是base knowledge
(2) StringBuffer (我之前所在公司项目大量使用)
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public synchronized StringBuffer append(Object obj) { super.append(String.valueOf(obj)); return this; } }
(a)extends AbstractStringBuilder扩展了抽象类,对基类的append加入同步机制, so it's thread-safe.看到这里,就不得不说Thread的一些knowledge了,比如同步方法lock的是object or class?如果我要加个static那结论又如何呢?
(b)线程同步问题真的是一个非常interesting and hot-blooded的技术,以前一直搞SQL CURD,一次interview,连wait,notify/notifyall都搞不清。
(c) extends + implements 组合真的可以OO,不是XXOO,是OO。⊙﹏⊙b汗 ,最近看tomcat sourcecode,tomcat里用了很多这样的组合,并且JDK也是,以前从未关注过,也是看了OO方面的书籍,似乎是懂了一些什么样的应该implements,什么样的应该extends(不是语法含义的问题,而是对于现实问题的抽象边界问题)
(d)其实StringBuffer也是final的,为什么是可变的呢?这就归咎与JVM中const pool与object的概念了。引申一下,java是传值还是传引用呢?呵呵
(3)StringBuilder
和StringBuffer一样,只不过append不是同步方法.不细说了.
(4)java compiler 其实内部是喜欢StringBuilder的,比如2个StringObject操作的时候,是转换成StringBuilder的。
结论:如果不需要同步的时候,优先使用StringBuilder,你懂的
Postscript
一个类型转换搞这么一堆rubbish word。前2天还联想到一件事,去食堂吃饭的时候,一般大点的食堂都是有专门的窗口收费,打饭另外的窗口。
说到这里,你能想到什么?“啥,你说啥,午饭几个菜?? 别胡说”
不管你想到没有,反正我是想到了,multiple-thread
抽象一下:收费窗口是主线程,负责accept 请求(吃饭请求),然后入queue(排队打饭的queue那时一个长啊),打饭的胖师傅就是workthread,负责给你丫打饭。像不像我们常用的webserver,没错,就是这个意思,你懂的.
single thread -- >a task per thread --> threadpool (Doug Lea 估计经常吃食堂的,人家就能写出那么优秀的code)
绝对原创,随便喷 ,restriction只有一条,转载请标出处