站稳马步——(4)String/StringBuffer/StringBuilder

String、StringBuffer和StringBuilder的区别

 

这是面试中经常问到的问题。

 

所以,网上答案很多。

 

/** * * @author: ydj * @createTime: Nov 2, 2010 9:40:05 AM * */ public class TestStringStringBuffer { public static void stringReplace(String text) { // 把textString的地址copy给text,text也指向了textString的"java" // text.replace('j', 'i');的结果是"iava" // text = text.replace('j', 'i');就是重新使text指向"iava" // 由于该方法的返回类型是void,所以原来的textString没变 text = text.replace('j', 'i'); System.out.println(text); } public static void bufferReplace(StringBuffer text) { // textBuffer的地址copy给text // 然后沿着text指向的字符串(其实也就是textBuffer指向的对象)操作,添加一个"C" // 虽然没有任何返回,但是这个操作影响到了textBuffer所指向的字符串 // 所以上个方法打印"java",这个方法打印"javaC" text = text.append("C"); System.out.println(text); } public static void main(String args[]) { String textString = new String("java"); StringBuffer textBuffer = new StringBuffer("java"); StringBuilder textBuilder = new StringBuilder("java"); stringReplace(textString); bufferReplace(textBuffer); System.out.println(textString + textBuffer); } }

 

在开发中,如果确定字符串会经常变化(拼接),建议使用StringBuffer(线程安全);如果再确认是在单线程环境中,建议使用StringBuilder(非线程安全)。打开Jdk源代码看看便知:StringBuffer中方法基本都是同步的(synchronized)——线程安全;StringBuilder是从 JDK 5 开始,为StringBuffer补充了一个单个线程使用的等价类。

 

故而,基本性能是:StringBuilder>StringBuffer>String

你可能感兴趣的:(java,jdk,String,面试,Class,2010)