现在的String操作究竟有没有必要用Stringbuilder、StringBuffer

现在的String操作究竟有没有必要用Stringbuilder、StringBuffer
1、性能不一样,大致速度StringBuilder > StringBuffer > String
2、再来说线程安全
   在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
3、再来说说现在用+连接字符串与用StringBuilder拼接的事
这个其实就现在而言,也就是jdk1.5开始(StringBuilder出现),其实也就是从这时候起用+连接字符串实际就是用的StringBuilder拼接了。不信我们来上代码
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第1张图片

先对比看看直接+连接class会是什么样,注意标红的地方
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第2张图片
如果用jd-gui看class文件,会发现JVM直接将一行连+的字符串定义为一个字符串了。

从这里我们没有验证到多个String对象使用+连接是使用的StringBuilder,于是我们用jad命令将class文件转为字节码文件再看,那怎么转呢?
首先cmd,然后输入jad,如果看到
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第3张图片
说明你的反编译环境是好的,其实只要在开发工具eclipse里安装过反编译插件,这里就可以直接用的。
然后我们输入命令
jad -o -a -s d.java E:\workspaces\oxyGen\20180103\Aps2\build\classes\test\study\StudyTypeChange.class
出现:
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第4张图片
这里没有指定输出目录一般会在用户目录下,例如:
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第5张图片
最后用文本工具打开查看
现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第6张图片
到此我们就get到了,所以说现在字符串对象的+实际就是StringBuilder,那么中间的一些String实际上是要被GC回收的,显然这样做性能就慢了。
至于 StringBuilder > StringBuffer这个应该大家都知道,StringBuffer加了锁来保证线程安全,那肯定就会慢那么一丢丢。
其实我现在看StringUtil的源码,在疑惑为什么它不用StringBuffer线程安全的而用StringBuilder?

现在的String操作究竟有没有必要用Stringbuilder、StringBuffer_第7张图片

你可能感兴趣的:(反编译,源码解读)