1.String
String類是不可變的,所謂不可變意思就是創建一個類后任何對String的改變都會引發新的String對象的生成;
讓我們舉個例子來看看就明白了:
String str ="abc";
str = str +"def";//這一步jvm會再次創建一個String對象
第二次其實jvm又生成了一個String類,而不是直接覆蓋原來的"abc",因此我們說String類是不可改變類。這一種特性會帶來一個問題,每次拼接都要創建都要創建一次對象,當我們要拼接大量字符串的時候,效率會變得非常非常慢。
2.StringBuffer
StringBuffer不同于String的是StringBuffer是可變的,一樣的我們來舉個例子看看:
StringBuffer sb =new StringBuffer("abc");
sb.append("efg");//并沒有創建一個新的對象
這里第二步并沒有產生一個新的對象,而是在原來的基礎上追加字符串,這種方式在拼接字符串的時候效率肯定比String要高得多。
3.StringBuilder
StringBuffer和StringBuilder類的區別也是如此,他們的原理和操作基本相同,區別在于StringBuffer支持并發操作,線性安全的,適合多線程中使用。
StringBuilder不支持并發操作,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。
點評:上面大概介紹了String、StringBuffer、StringBuilder的區別,那么我們要處理字符串的時候要選擇哪個呢?總結如下:
1.如果要操作少量的數據用 String
2.單線程操作字符串緩沖區下操作大量數據用StringBuilder
3.多線程操作字符串緩沖區下操作大量數據用StringBuffer