探索String、StringBuilder、StringBuffer
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan看到String是不是有种熟悉的赶脚,String是由字符拼接成的串。他们三者虽然都是和字符串打交道,但是在性能上也是有个伯仲叔的,一般情况下String是这三者中的最慢,其次是StringBuffer,然后是StringBuilder。String是“字符串常量”,...
强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan
看到String是不是有种熟悉的赶脚,String是由字符拼接成的串。他们三者虽然都是和字符串打交道,但是在性能上也是有个伯仲叔的,一般情况下String是这三者中的最慢,其次是StringBuffer,然后是StringBuilder。String是“字符串常量”,StringBuffer是“字符串变量”(线程安全),StringBuilder是“字符串变量”(非线程安全),StringBuilder经常用在单线程的情况下。相信有些编程经验的人都对常量和变量有个理解,看他们三者的汉语解释清楚的可知,String是常量,也就是一旦定义好了就不会改变,有的人就感觉很奇怪,既然是常量,我们平时也用String来拼接呀!进入正题:
探秘String
为了下述的Demo我们可以更高效的理解,先来弄明白equals和==的区别:
java中的所有对象都是继承自Object类的,equals是String对象的一个方法,是可以直接点出来的,他相比较的是两个对象的值是否相等,只要值相等结果就为True。
==比较的不仅仅是两个对象的值是否相等,还要比较两个对象的引用是否是否一样,也就是是否指向同一个对象,在值相等,引用相同的前提下比较结果才为True。
来看几段代码:
//<span style="font-family: Arial, Helvetica, sans-serif;">1.</span>第一种情况
String s1 = "hello";
String s3 = "hello"; <pre name="code" class="java"> System.out.println(s1.equals(s3); //结果为True
System.out.println(s1==s3); //结果为True
解说:在程序 运行的时候会创建一个字符串缓冲池用来存放创建的字符串,第一次我们创建了s1指向hello这个对象,当创建s3的时候会先去缓冲池中查找相同值的对象,找到后将s3的引用指向s1创建时的hello对象,他们指向了同一个对象,自然值也相等,因此两种类型的比较结果都是True。
//2.第二种情况
s1 = new String("hello");
s2 = new String("hello");
System.out.println(s1.equals(s2); //结果为True
System.out.println(s1==s2); //结果为False
解说:new是创建新对象的过程,因此s1和s2是两个不同的对象。由于这两个对象的值相等,所以equals的结果为True,而==的结果为False.
区别String、StringBuffer、StringBuilder
String拼接字符串有两种情况:这两种情况虽然结果相同,但是效率相差甚远,第一种情况下JVM自动默认优化,默认为s1="ab",在本文开篇就讲解了String是字符串常量,也就意味着对String对象进行拼接是不会对原对象造成影响,而是会形成新对象,对新对象进行的操作。也就出现了第二种情况,创建一个s1对象,再创建第s2对象,拼接的时候再创建一个s3对象,拼接处的s3="ab",自然效率是不同的。
//1.第一种情况
String s1 = "a" + "b"; //拼接
//2.第二种情况
String s1 = "a";
String s2 = "b";
String s3 = "a" + "b"; //拼接
String是不可变的,每一次改变都会生成新的对象,而StringBuffer每次拼接是在原对象的基础上拼接,以append方法为例:
//3.第三种情况
//String和StringBuffer
String s = "a";
StringBuffer s1 = new StringBuffer(a);
s1.append("b"); //拼接
s = "a" + "b"; //拼接
4.StringBuffer和StringBuilder
他们两个前者是线程安全,后者是非线程安全,前者在线程同步保证线程安全时导致性能下降,后者不是线程安全的,在单线程的情况下提高了性能。在单线程的情况下后者是比较快的。
结论
1.需要动态拼接的时候使用StringBuffer或StringBuilder,而不建议使用String
2.没必要多线程同步时使用StringBuilder效率较高
3.必须用多线程时使用StringBuffer效率较高
更多推荐
所有评论(0)