A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 紫薰iy 中级黑马   /  2014-10-22 12:21  /  1272 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 紫薰iy 于 2014-10-22 12:22 编辑

public class TestStringBuffereBuillder {
        final static int NUM = 100000000;
        public static void main(String[] args) {
                //测试的次数
                for (int j = 0; j < 5; j++) {
                        System.out.print(j+" ");
                        testString();
                        testStringBuffere();
                        testStringBuilder();
                }
               
        }
        public static void testString(){
                String string = "mmmmxxxxyy";
                long startTime = System.currentTimeMillis();
                for (int i = 0; i < NUM; i++) {
                        //String类中的方法,用于在String后连接字符串
                        string.concat("88");
                        //截取新的字符串
                        string = string.substring(0, 10);
                }
                long endTime = System.currentTimeMillis();
                System.out.print((endTime - startTime) + "ms   ");
        }
        public static void testStringBuffere(){
                StringBuffer stringBuffer = new StringBuffer("mmmmxxxxyy");
                long startTime1 = System.currentTimeMillis();
                for (int i = 0; i < NUM; i++) {
                        //StringBuffer与StringBuillder中的方法,末尾添加字符串与删除制定位置的字符串
                        stringBuffer.append("88");
                        stringBuffer = stringBuffer.delete(10, 12);
                }
                long endTime1 = System.currentTimeMillis();
                System.out.print((endTime1 - startTime1) + "ms  ");
        }
        public static void testStringBuilder(){
                StringBuilder stringBuilder = new StringBuilder("mmmmxxxxyy");
                long startTime1 = System.currentTimeMillis();
                for (int i = 0; i < NUM; i++) {
                        stringBuilder.append("88");
                        stringBuilder = stringBuilder.delete(10, 12);
                }
                long endTime1 = System.currentTimeMillis();
                System.out.println((endTime1 - startTime1) + "ms");
        }
}
输出结果


     可以看到,在大量对字符串的操作的情况下,String的效率要低得多。String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
      而StringBuffere和StringBuilder之间相差的不是太大。使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

     基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffere。

无标题.jpg (21.36 KB, 下载次数: 10)

无标题.jpg

2 个回复

倒序浏览
  1. package itHeima.RUXUE2;

  2. import org.junit.Test;

  3. public class Test16 {
  4.         private final int time = 20000;

  5.         @Test
  6.         public void test(){
  7.                 test_String();
  8.                 test_StringBuffer();
  9.                 test_StringBuilder();
  10.                
  11.         }
  12.        
  13.         //测试String类的增删效率
  14.         public void test_String(){
  15.                 long startTime = myAdvice.getStart();
  16.                 String str = "ABCDE";
  17.                 for(int i = 0; i<time; i++){
  18.                         str = str +"!";
  19.                         str = str.substring(0, i);
  20.                 }
  21.                 long endTime = myAdvice.getEnd();
  22.                 System.out.println("String类的花费时间为:"+(endTime-startTime));
  23.         }
  24.         //测试StringBuffer的增删效率
  25.         public void test_StringBuffer(){
  26.                 long startTime = myAdvice.getStart();
  27.                 StringBuffer str = new StringBuffer("ABCDE");
  28.                 for(int i = 0; i<time; i++){
  29.                         str.append("!");
  30.                         str = new StringBuffer(str.substring(0, i));
  31.                 }
  32.                 long endTime = myAdvice.getEnd();
  33.                 System.out.println("StringBuffer类的花费时间为:"+(endTime-startTime));
  34.         }
  35.         //测试StringBuilder的增删效率
  36.         public void test_StringBuilder() {
  37.                 long startTime = myAdvice.getStart();
  38.                 StringBuilder str = new StringBuilder("ABCDE");
  39.                 for (int i = 0; i < time; i++) {
  40.                         str.append("!");
  41.                         str = new StringBuilder(str.substring(0, i));
  42.                 }
  43.                 long endTime = myAdvice.getEnd();
  44.                 System.out.println("StringBuilder类的花费时间为:" + (endTime - startTime));
  45.         }
  46.        
  47. }
  48. class myAdvice{
  49.         public static long getStart(){
  50.                 return System.currentTimeMillis();
  51.         }
  52.         public static long getEnd(){
  53.                 return System.currentTimeMillis();
  54.         }
  55. }
复制代码


我也写了一个,不过效果不是很明显,相差的时间并不多,StringBuilder时间用时最少
回复 使用道具 举报
贾浩田 发表于 2014-10-27 21:00
我也写了一个,不过效果不是很明显,相差的时间并不多,StringBuilder时间用时最少 ...

次数太少了。数量少看不到效果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马