String+String和StringBuilder.append(String)的效率和区别

来源:互联网 发布:高中数学讲解视频软件 编辑:程序博客网 时间:2024/05/08 03:13

在写程序的时候以前常用String来直接加,后面慢慢发现这样的效率比较低下,后来改成用StringBuilder或者StringBuffer来进行字符串的拼接。有同事告诉我,其实直接用String+String的方式[下称S+S方式],编译器自己会弄成StringBuilder.append()的方式[下称append方式],我也没有实验过,也不好反对,但是我感觉应该是不对的,所以就有了以下的实验。

实验很简单,就是初始化一个字符串“1”,然后在这个基础上循环一定次数的拼接字符串“1”。

一、首先看看两种方式的运行时间:

1、S+S方式

public class TestString {    public static void main(String[] args) {        String a="1";        long startTime=System.currentTimeMillis();        for(int i=0;i<100000;i++){            a=a+"1";        }        long endTime=System.currentTimeMillis();        System.out.print(endTime-startTime);    }}
运行时间:


2、append方式

public class TestBuilding {    public static void main(String[] args) {        StringBuilder a=new StringBuilder("1");        long startTime=System.currentTimeMillis();        for(int i=0;i<1000000;i++){            a.append("1");        }        long endTime=System.currentTimeMillis();        System.out.print(endTime-startTime);    }}
运行时间:

S+S方式消耗的时间为9099,append方式消耗的时间为17,很明显,S+S方式非常耗费时间,不知道各位看清楚没,S+S只循环了10W次,而append循环了100W次


二、看看两种方式的字节码

1、S+S方式

Compiled from "TestString.java"public class TestString extends java.lang.Object{public TestString();  Code:   0:aload_0   1:invokespecial#1; //Method java/lang/Object."<init>":()V   4:returnpublic static void main(java.lang.String[]);  Code:   0:ldc#2; //String 1   2:astore_1   3:invokestatic#3; //Method java/lang/System.currentTimeMillis:()J   6:lstore_2   7:iconst_0   8:istore4   10:iload4   12:ldc#4; //int 100000   14:if_icmpge43   17:new#5; //class java/lang/StringBuilder   20:dup   21:invokespecial#6; //Method java/lang/StringBuilder."<init>":()V   24:aload_1   25:invokevirtual#7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;   28:ldc#2; //String 1   30:invokevirtual#7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;   33:invokevirtual#8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;   36:astore_1   37:iinc4, 1   40:goto10   43:invokestatic#3; //Method java/lang/System.currentTimeMillis:()J   46:lstore4   48:getstatic#9; //Field java/lang/System.out:Ljava/io/PrintStream;   51:lload4   53:lload_2   54:lsub   55:invokevirtual#10; //Method java/io/PrintStream.print:(J)V   58:return}

2、append方式

Compiled from "TestBuilding.java"public class TestBuilding extends java.lang.Object{public TestBuilding();  Code:   0:aload_0   1:invokespecial#1; //Method java/lang/Object."<init>":()V   4:returnpublic static void main(java.lang.String[]);  Code:   0:new#2; //class java/lang/StringBuilder   3:dup   4:ldc#3; //String 1   6:invokespecial#4; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V   9:astore_1   10:invokestatic#5; //Method java/lang/System.currentTimeMillis:()J   13:lstore_2   14:iconst_0   15:istore4   17:iload4   19:ldc#6; //int 1000000   21:if_icmpge37   24:aload_1   25:ldc#3; //String 1   27:invokevirtual#7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;   30:pop   31:iinc4, 1   34:goto17   37:invokestatic#5; //Method java/lang/System.currentTimeMillis:()J   40:lstore4   42:getstatic#8; //Field java/lang/System.out:Ljava/io/PrintStream;   45:lload4   47:lload_2   48:lsub   49:invokevirtual#9; //Method java/io/PrintStream.print:(J)V   52:return}
比较两个方式的字节码文件,发现都有StringBuilder的影子,但是不同的是S+S方式每次都有toString这个方法(见S+S字节码33行)并且编译器优化的StringBuilder是每次循环都会new一个,会产生更多的对象所以及其的慢
具体内存变化见图


所以,大量字符串拼接的时候,用StringBuild更理想,更效率,两个字符串拼接的时候倒是无所谓。另外StringBuilder和StringBuffer都比S+S方式更优化,只是StringBuilder是非线程安全的,而StringBuffer是线程安全的



另外附上S+S方式,循环100W次JVM的内存变化图(并未循环完100W次)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老师上课迟到了怎么办 艾滋病看守所不收怎么办 没能力偿还债务怎么办 监狱病人的癌症怎么办 监狱的传染病人怎么办 犯人在监狱重病怎么办 亲戚被关拘留所怎么办 打麻将被拘留怎么办 轻伤检察院不批捕怎么办 吸毒人被拘留怎么办 法院拘留没去怎么办 羁押期限超过了怎么办 羁押期限已满怎么办 刑事拘留22天了怎么办 被派出所拘留 车怎么办 被公安怀疑贩毒怎么办 报案后证据不足怎么办 担心丈夫复嫖怎么办 交通事故当事人重伤笔录怎么办 交通事故做完笔录后怎么办 罚款单子丢了怎么办 刑事案件人跑了怎么办 打架当事人跑了怎么办 赌博被派出所抓怎么办 治安案件人跑了怎么办 去警察局做笔录怎么办 未成年打架留下案底怎么办 土地被别人侵占怎么办 在公安局有案底怎么办 做小姐有案底怎么办 党员被黑社会打怎么办 周期内被扣15分怎么办 驾证扣了50分怎么办? 酒驾拘留工作怎么办 开电动车被拘留怎么办 有一次吸毒案底怎么办 家里收到拘留书怎么办 吸毒有案底结婚怎么办 坐牢了房子按揭怎么办 被刑事拘留15天怎么办 看守所没人交生活费怎么办