JAVA中String的纵向分析深入

来源:互联网 发布:软件开发行业趋势 编辑:程序博客网 时间:2024/05/01 12:31
String s = "123";s+="abc";System.out.println(s);

看以上代码


学JAVA的都知道String是不可变的,一旦初始化了,就不可以变化了,可变的应该是StringBuffer类型


那么以上代码怎么解释呢?


DEBUG你会发现第一句和第二句的s不是同一个s,这样的话,就可以解释了


虽然s变了,但是前后已经不是同一个对象s了。


这里的连接是编译器自动调用了StringBuffer类,因为它认为它更高效


JAVA编程思想一书中也有解释:P-283(中)P-503(English)...实际上都创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动...


来个性能比较

int len = 10000;StringBuffer sb = new StringBuffer();long begin1 = System.currentTimeMillis();for(int i=0;i<len;i++) {sb.append(i);}long end1 = System.currentTimeMillis();System.out.println(end1-begin1);String str = "";long begin2 = System.currentTimeMillis();for(int i=0;i<len;i++) {str+=i;}long end2 = System.currentTimeMillis();System.out.println(end2-begin2);
9
174

不用我说了,StringBuffer性能的确好很多,毕竟用了Buffer机制

扩展

java5引入了StringBuilder,由于StringBuffer是线程安全的,而StringBuilder是非线程安全的,所以StringBuffer开销会更大,理所当然StringBuilder会更快

int len = 10000000;StringBuffer sb = new StringBuffer();long begin1 = System.currentTimeMillis();for(int i=0;i<len;i++) {sb.append(i);}long end1 = System.currentTimeMillis();System.out.println(end1-begin1);StringBuilder str = new StringBuilder();long begin2 = System.currentTimeMillis();for(int i=0;i<len;i++) {str.append(i);}long end2 = System.currentTimeMillis();System.out.println(end2-begin2);
487
340

当然差距不是很明显






原创粉丝点击