上周加班,这周依然如此(今天早上还真是冷,冬天真的来了...)
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只有一条,转载请标出处
分享到:
相关推荐
11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11.类型转换.zip11....
25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java类型转换.zip25.java...
26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型转换.zip26.java自动类型...
27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型...
1.解析json字符串 2.将json字符串转换为java对象 3.将java对象转换为json字符串
易语言源码易语言对象转换进制源码.rar 易语言源码易语言对象转换进制源码.rar 易语言源码易语言对象转换进制源码.rar 易语言源码易语言对象转换进制源码.rar 易语言源码易语言对象转换进制源码.rar 易语言源码...
常见java中数据类型之间的转换.txt常见java中数据类型之间的转换.txt常见java中数据类型之间的转换.txt
视频转换大师8.0.0.0视频转换大师8.0.0.0视频转换大师8.0.0.0视频转换大师8.0.0.0
进制转换、数据类型、类型转换、运算符.zip
易语言源码易语言对象型编码转换源码.rar 易语言源码易语言对象型编码转换源码.rar 易语言源码易语言对象型编码转换源码.rar 易语言源码易语言对象型编码转换源码.rar 易语言源码易语言对象型编码转换源码.rar ...
易语言源码易语言对象版编码转换模块源码.rar 易语言源码易语言对象版编码转换模块源码.rar 易语言源码易语言对象版编码转换模块源码.rar 易语言源码易语言对象版编码转换模块源码.rar 易语言源码易语言对象版...
H.264转换工具1.2.zipH.264转换工具1.2.zipH.264转换工具1.2.zip
C语言数据类型转换ppt课件.ppt
C语言中混合类型计算和类型转换的问题.pdf
介绍了C#常用变量类型的转换,简单实用: 1. 装箱、拆箱还是别名; 2. 数值类型之间的相互转换; 3. 字符的 ASCII 码和 Unicode 码; 4. 数值字符串和数值之间的转换; 5. 字符串和字符数组之间的转换; 6. 字符串和...
C语言数据类型转换PPT课件.pptx
C语言数据类型转换学习教案.pptx
C语言数据类型转换的探讨.pdf
金蝶K3进度15-数据类型转换操作流程.docx
VC常用数据类型使用转换详解.mhtVC常用数据类型使用转换详解.mhtVC常用数据类型使用转换详解.mhtVC常用数据类型使用转换详解.mhtVC常用数据类型使用转换详解.mhtVC常用数据类型使用转换详解.mht