String,StringBuilder和StringBuffer

来源:互联网 发布:sql语句计算平均值 编辑:程序博客网 时间:2024/06/06 16:29

参考:<java编程思想>

首先看如下的例子

import java.util.Random;public class StirngTest {public static Random rand=new Random(47);public static void main(String[] args) {useStringSimple();useStringBuilderSimple();useString();useStringBuilder();}public static void useStringSimple(){long start=System.nanoTime();String a="abc";String s=a+"def"+"gh";long end=System.nanoTime();System.out.println(end-start);}public static void useStringBuilderSimple(){long start=System.nanoTime();StringBuilder sb=new StringBuilder();sb.append("abc").append("def").append("ghi");long end=System.nanoTime();System.out.println(end-start);}public static void useString(){         long start=System.nanoTime();         String str=null;         for(int i=0;i<10;i++){                 str+=rand.nextInt(100);         }         long end=System.nanoTime();         System.out.println(end-start); } public static void useStringBuilder(){         StringBuilder sb=new StringBuilder();         long start=System.nanoTime();         for(int i=0;i<10;i++){                 sb.append(rand.nextInt(100));         }         long end=System.nanoTime();         System.out.println(end-start); } }


1.String对象时不可变的,不可变后带来一定的效率问题;但是当数据量较少时,StringBuilder的效率也不一定比String高

2.java虚拟机会为string对象创建StringBuilder对象,但是每次循环都会创建一个stringBuilder对象,因此会在一定程度上降低速度;

通过javap -c Stringtest命令将class文件反汇编成JVM字节码文件,可以看到(由43行重新跳到第8行)



3.StringBuffer是线程安全的,因此开销也会大一些;

使用准则:

如果要操作少量的数据用 = String

单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

多线程操作字符串缓冲区 下操作大量数据 = StringBuffer