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