1. 程式人生 > >關於String StringBuffer 和 StringBulider

關於String StringBuffer 和 StringBulider

int 次循環 system 系統 .html 線程安全 equal 代碼 build

關於String StringBuffer 和 StringBulider

String是java中字符串中引用類型。

1.關於==和equals,String字符串的==通常用來判斷兩個字符串在內存中的地址是否一致,equals用來判斷字符串中存放的內容是否一致。

技術分享
public class Strings {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "hello";
        String str3 = new String("hello");
        String str4 = "he"+"llo";
        String str5 = "he";
        str5 = str5 +"llo";
        
        System.out.println(str1==str2);   //true;
        System.out.println(str1==str3);   //false;
        System.out.println(str1==str4);      //true;
        System.out.println(str1==str5);   //false;
        System.out.println("--------------------");
        System.out.println(str1.equals(str2));   //true;
        System.out.println(str1.equals(str3));   //true;
        System.out.println(str1.equals(str4));   //true;
        System.out.println(str1.equals(str5));   //true;
    }
}
技術分享

2.關於字符串的運算效率問題。在字符串的多次循環疊加中直接使用"+"是非常耗費內存和時間的,因為每一次相加,系統都將創建一次對象。建議使用StringBuilder進行字符串運算,可以有效解決字符串相加效率不高的問題。

技術分享
    private static String stringCal() {   //3486ms
        String s0 = "abcdefghijklmnopqrstuvwxyz";
        String s = "";
        for(int i=0;i<10000;i++) {
            s += s0;//s = s + s0;
        }
        return s;
    }
    
    private static String stringBuildCal() { //2ms
        String s0 = "abcdefghijklmnopqrstuvwxyz";
        StringBuilder s = new StringBuilder();
        for(int i=0;i<10000;i++) {
            s.append(s0);
        }
        return s.toString();
    }
    
技術分享

StringBuilder與 StringBuffer

    StringBuilder:線程非安全的

    StringBuffer:線程安全的

    當我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

關於String StringBuffer 和 StringBulider