懒的搞什么开头了,直接撸代码吧
想了想还是给大家看看学姐照片吧,保持眼睛的明亮,代码敲多了,伤眼
1: 作StringBuilder与String的拼接比较
@Test
public void testString () {String s="";long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;String s4 = s1+s2+s3;}long over = System.currentTimeMillis();System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
@Test
public void testStringBuilder () {StringBuilder sb = new StringBuilder();long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;String s4= new StringBuilder(s1).append(s2).append(s3).toString();}long over = System.currentTimeMillis();System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
操作java.lang.StringBuilder
类型使用的时间为:146毫秒
操作java.lang.String
类型使用的时间为:139毫秒
将testStringBuilder
改为
StringBuilder s4= new StringBuilder(s1).append(s2).append(s3);
操作java.lang.StringBuilder
类型使用的时间为:110毫秒
可以看出,直接使用 s1 的 + 运算,速度要快还要快些。不把StringBuilder
转成String
时, 情况好一点。
原因分析: 其实String
的 + 本质上就是StringBuilder
运算,估计JAVA还做了一些优化,导至速度比StringBuilder
还快。
得出结论是,多个变量一次性拼接的场景,直接使用 String +
速度不差,便如果有不需要转成String的话,StringBuilder
还是优秀一些。
StringBuilder
连续多次不转》 String
连接多次》StringBuilder
连续多次转
2: 多次拼接场景谁更优秀
@Test
public void testString () {String s="";long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;String s2 = s1 + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;String s3 = s2+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;}long over = System.currentTimeMillis();System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
@Test
public void testStringBuilder () {StringBuilder sb = new StringBuilder();long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;StringBuilder s4= new StringBuilder(s1);String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;s4.append(s2);String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;s4.append(s3);// s4.append(UUIDUtil.uuid());}long over = System.currentTimeMillis();System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
操作java.lang.StringBuilder
类型使用的时间为:110毫秒
操作java.lang.String
类型使用的时间为:205毫秒
可以看出,如果是非连续的场景,StringBuilder
性能已经远远的超过了String。
让StringBuilder 更进一步
@Test
public void testStringBuilder () {StringBuilder sb = new StringBuilder();long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){StringBuilder s4= new StringBuilder(300);String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;s4.append(s1);String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;s4.append(s2);String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;s4.append(s3);// s4.append(UUIDUtil.uuid());}long over = System.currentTimeMillis();System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
操作java.lang.StringBuilder
类型使用的时间为:57毫秒
通过,预先设置StringBuilder
的大小(前提是你要会预估), 可以再次提升StringBuilder
能力。原因是StringBuilder
放不下时,会扩容。
让StringBuilder能力起飞的操作
@Test
public void testStringBuilder () {StringBuilder sb = new StringBuilder();long begin = System.currentTimeMillis();StringBuilder s4= new StringBuilder(300);for(int i=0; i<500000; i++){s4.setLength(0);String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;s4.append(s1);String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;s4.append(s2);String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;s4.append(s3);// s4.append(UUIDUtil.uuid());}//加入Java开发交流君样:756584822一起吹水聊天long over = System.currentTimeMillis();System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}
操作java.lang.StringBuilder类型使用的时间为:15毫秒
在遇到字符串拼接性能要求高的场景,性能由高到低如下:
StringBuilder
(内存复用 15mm) > StringBuilder
(预先定义内存大小 57)>StringBuilder
(拼接不转String 110) > String (连续拼接 139) > StringBuilder
(拼接转String 146)
真的起飞在这里
@Testpublic void testString () {String s="";long begin = System.currentTimeMillis();for(int i=0; i<500000; i++){String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" +"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" +"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;}long over = System.currentTimeMillis();System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");}
操作java.lang.String
类型使用的时间为:0毫秒
这个已经在编译时,已经合成一个String了,没有使用append操作。如果你对性能有要求,而且可以使用,请这样用。
最后,祝大家早日学有所成,拿到满意offer