测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~
懶的搞什么開頭了,直接擼代碼吧
想了想還是給大家看看學姐照片吧,保持眼睛的明亮,代碼敲多了,傷眼
 
 
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
總結
以上是生活随笔為你收集整理的测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 彩票中奖是天选还是机选?
- 下一篇: 面试被问到Java 静态代理/动态代理?
