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