.net与Java对字符串联解决方案的比较
最近和一个朋友用java做了一个多语专用工具,这个人出生在java,我出生在java.net出生,最近逐渐从事java,发现她用Stringbufer解决字符串连接,但我用Stringbuilder。(.Java也有net中介绍的字符串连接类别,所以它被使用),偶尔,“StringBuffer"它是干什么用的,它和Stringbuilder有什么区别?
1.变量定义字符串连接
1、.net
比如
string str = "This is " " a " "test.";
编译程序后,使用reflector进行反汇编,可以看出,编译程序已经为每个人计算了结论,防止了每次操作的重算,带来了高效率。
string str="This is a test.";
比如2、Java
String str=“This is ” " a " "test.".
编译程序后,反射面将得出类似下面的结论。
String abc=new StringBuilder("This is ").append(" a ").append("test.").
也就是说,每次操作都要重新计算。
总结:从这个角度看.net对变量定义字符串数组的处理方法将比java快,因为它在编译过程中已经计算出来,并且在运行过程中是一个变量定义。
二、Stringbuilder和StringBuffer
1、.只有Stringbuilder在net中,没有Stringbufer,这是非线程安全的。以下属于msdn中Stringbuilder在线程安全层面的描述
线程安全 所有这类公共静态数据(Visual Basic 里的 Shared)所有成员都是线程安全的,但并不能保证所有案例成员都是线程安全的。
2、JAVA
StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)
两者都有自Abstractstringbuilder,内部方式都是对父亲类相应方式的启用,可以理解为他们都是Abstractstringbuilder的包装,只是线程安全的外包装(StringBuffer),另一种是过程中不安全的外包装(StringBuilder)。
StringBuffer概念:
public final class StringBuffer
extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuffer() { super(16); } public StringBuffer(int capacity) { super(capacity); }
概念StringBuilder
public final class StringBuilder
extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuilder() { super(16); } public StringBuilder(int capacity) { super(capacity); }
下面看看append(String str)的处理方法
StringBuffer:
public synchronized StringBuffer append(String str) {
super.append(str); return this; }
StringBuilder:
public StringBuilder append(String str) {
super.append(str); return this; }
比较上述两部分编码,不难发现,两者的编码基本相同,会使用成员变量对应的方式。不同的是,Stringbuffer增加了一个关键字synchronized,以确保方法调用的原子,即线程安全,这也需要消耗服务器资源。