天天看點

String、StringBuilder與StringBuffer的差別

1.String類是public、final修飾的。

在Java中,被final修飾的類是不允許被繼承的,并且String它的成員方法都預設為final方法。

檢視源碼得知,String類其實是通過char數組來儲存字元串的。

對所有的String對象操作都不是在原有的字元串上進行的,而是重新生成了一個新的字元串對象。

也就是說進行這些操作後,最原始的字元串并沒有被改變,String類是不可變類。

如果我們用String來操作字元串的時候,一旦我們字元串的值改變,就會在記憶體建立多一個空間來儲存新的字元串,是以頻繁操作String效率會很低。

對String對象的任何改變都不影響到原對象,相關的任何change操作都會生成新的對象。

1 package com.rong.se;
 2 
 3 public class UseString {
 4 
 5     /**
 6      * String操作
 7      * @author 容傑龍
 8      */
 9     public static void main(String[] args) {
10         String string="rong-jie-long";
11         //String重載很多構造方法,不列舉。。。
12         String str=new String("abc well");
13         
14         char ch = str.charAt(0);
15         System.out.println(ch);
16         int codePointAt = str.codePointAt(1);
17         System.out.println(codePointAt);
18         int codePointBefore = str.codePointBefore(1);
19         System.out.println(codePointBefore);
20         //相等傳回0  比較大小
21         int compareTo = str.compareTo("abc well");
22         System.out.println(compareTo);
23         int compareToIgnoreCase = str.compareToIgnoreCase("ABC WELL");
24         System.out.println(compareToIgnoreCase);
25         //類似+
26         String concat = str.concat(string);
27         System.out.println(concat);
28         //以什麼開始
29         boolean endsWith = str.endsWith("ll");
30         System.out.println(endsWith);
31         boolean startsWith = str.startsWith("abc");
32         System.out.println(startsWith);
33         //包括索引位置為5的字元
34         String substring = string.substring(5);
35         System.out.println(substring);
36         String[] split = string.split("-");
37         for (String string2 : split) {
38             System.out.println(string2);
39         }
40         //限制最多分成幾段
41         String[] split2 = string.split("-", 3);
42         for (String string2 : split2) {
43             System.out.println(string2);
44         }
45         //比較是否相等,區分大小寫
46         boolean equals = str.equals(string);
47         System.out.println(equals);
48         //比較是否相等,不區分大小寫
49         boolean equalsIgnoreCase = str.equalsIgnoreCase(string);
50         System.out.println(equalsIgnoreCase);
51         int length = str.length();
52         System.out.println(length);
53         // 。。。。。。。。。。。。。。。。。。
54     }
55 
56 }      

2.StringBuilder不支援并發操作,線程不安全的,不适合多線程中使用,但其在單線程中的性能比StringBuffer高,是可變類,

任何對它所指代的字元串的改變都不會産生新的對象。

1 package com.rong.se;
 2 
 3 public class TestStringBuilder {
 4 
 5     public static void main(String[] args) {
 6         //建立StringBuilder對象
 7         StringBuilder sb=new StringBuilder();
 8         StringBuilder stringBuilder=new StringBuilder("abcdefg");
 9         sb.append(123);
10         sb.append("hhh");
11         sb.append(3.14159265354);
12         System.out.println(sb.toString());
13         //////////////////////////////
14         System.out.println(sb.charAt(3));
15         //可變類, 操作後仍然是同一個對象,隻是内容不一樣
16         sb.delete(0, 10);//左閉右開,可傳回對象,同一個對象
17         System.out.println(sb);
18         //删除索引位置字元,可傳回對象,同一個對象
19         StringBuilder deleteCharAt = sb.deleteCharAt(0);
20         System.out.println(sb);
21         //true,同一個對象
22         boolean b = sb.equals(deleteCharAt);
23         System.out.println(b);
24         //擷取字元串首次出現的索引位置
25         int indexOf = sb.indexOf("53");
26         System.out.println(indexOf);
27         //從索引位置第幾個開始插入字元串,可插入多種類型資料
28         sb.insert(3, "www");
29         sb.insert(3, 123.123);
30         System.out.println(sb.toString());
31         int lastIndexOf = sb.lastIndexOf("12", 6);
32         System.out.println(lastIndexOf);
33         System.out.println(sb.length());
34         //替換。左閉右開原則。
35         StringBuilder replace = sb.replace(0, 3, "r");
36         System.out.println(replace);
37         //反轉
38         sb.reverse();
39         System.out.println(sb);
40         // 從索引位置第n個起(包含n),截取字元串,生成新的字元串!!!
41         String substring = sb.substring(10);
42         System.out.println(substring);
43         //轉成String
44         String string = sb.toString();
45         System.out.println(string);
46         
47         
48     }
49 
50 }      

3.StringBuffer則是可變類,是線程安全的,任何對它所指代的字元串的改變都不會産生新的對象。

 StringBuffer的操作與StringBuilder操作類似,基本相同。略。。。。。。

總結:

可變與不可變、線程安全與不安全、執行效率

String直接相加字元串,效率很高,因為在編譯器便确定了它的值,形如"a"+"b"+"c"; 的字元串相加,在編譯期間便被優化;對于間接相加(包含字元串引用),形如s1+s2+s3; 效率要比直接相加低,因為在編譯器不會對引用變量進行優化

String、StringBuilder、StringBuffer三者的執行效率:StringBuilder > StringBuffer > String(相對而言)

     當字元串相加操作或者改動較少的情況下:String 

  當字元串相加操作較多的情況下:StringBuilder

  當程式采用了多線程:StringBuffer