Java面试准备二:String、StringBuilder、StringBuffer

来源:互联网 发布:数据治理整体解决方案 编辑:程序博客网 时间:2024/06/07 06:58

该系列的Java面试复习内容全参考自近一个月的面试总结,在此谢谢博主的分享。
下面主要是我根据博主列出的Java基础部分需要了解的内容进行复习所做的笔记。这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢。

1. String、StringBuffer、StringBuilder区别

参考StringBuffer、StringBuilder区别
String、StringBuffer、StringBuilder,都能用来表示字符串。
String类是不可变类,任何对String的改变都能引发新的String的对象的生成。
StringBuffer是可变类,任何对它所指代的字符串的改变都不会产生新的对象。StringBuffer是线程安全的。
StringBuilder是线程不安全的。

eg:

public class StringTest {      public static String BASEINFO = "Mr.Y";      public static final int COUNT = 2000000;      /**      * 执行一项String赋值测试      */      public static void doStringTest() {          String str = new String(BASEINFO);          long starttime = System.currentTimeMillis();          for (int i = 0; i < COUNT / 100; i++) {              str = str + "miss";          }          long endtime = System.currentTimeMillis();          System.out.println((endtime - starttime)                  + " millis has costed when used String.");      }      /**      * 执行一项StringBuffer赋值测试      */      public static void doStringBufferTest() {          StringBuffer sb = new StringBuffer(BASEINFO);          long starttime = System.currentTimeMillis();          for (int i = 0; i < COUNT; i++) {              sb = sb.append("miss");          }          long endtime = System.currentTimeMillis();          System.out.println((endtime - starttime)                  + " millis has costed when used StringBuffer.");      }      /**      * 执行一项StringBuilder赋值测试      */      public static void doStringBuilderTest() {          StringBuilder sb = new StringBuilder(BASEINFO);          long starttime = System.currentTimeMillis();          for (int i = 0; i < COUNT; i++) {              sb = sb.append("miss");          }          long endtime = System.currentTimeMillis();          System.out.println((endtime - starttime)                  + " millis has costed when used StringBuilder.");      }      /**      * 测试StringBuffer遍历赋值结果      *       * @param mlist      */      public static void doStringBufferListTest(List<String> mlist) {          StringBuffer sb = new StringBuffer();          long starttime = System.currentTimeMillis();          for (String string : mlist) {              sb.append(string);          }          long endtime = System.currentTimeMillis();          System.out.println(sb.toString() + "buffer cost:"                  + (endtime - starttime) + " millis");      }      /**      * 测试StringBuilder迭代赋值结果      *       * @param mlist      */      public static void doStringBuilderListTest(List<String> mlist) {          StringBuilder sb = new StringBuilder();          long starttime = System.currentTimeMillis();          for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {              sb.append(iterator.next());          }          long endtime = System.currentTimeMillis();          System.out.println(sb.toString() + "builder cost:"                  + (endtime - starttime) + " millis");      }      public static void main(String[] args) {          doStringTest();          doStringBufferTest();          doStringBuilderTest();          List<String> list = new ArrayList<String>();          list.add(" I ");          list.add(" like ");          list.add(" BeiJing ");          list.add(" tian ");          list.add(" an ");          list.add(" men ");          list.add(" . ");          doStringBufferListTest(list);          doStringBuilderListTest(list);      }  }  

测试结果:
2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
I like BeiJing tian an men . buffer cost:1 millis
I like BeiJing tian an men . builder cost:0 millis

结论:从上面结果可以看出,不考虑多线程,采用String对象时,执行时间都比其他两个都要长,而采用StringBuffer和StringBuilder差别也比较明显。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑线程同步问题,我们应该优先使用StringBuilder类,如果要保证线程安全,自然是StringBuffer。

0 0