一、String簡單介紹
今天就簡單的介紹一下String鲫凶、StringBuilder、StringBuffer的區(qū)別衩辟,并沒有深入的了解底層原理螟炫,不過用來面對面試還是可以的。
首先來看String的源碼:
Java 提供了 String 類來創(chuàng)建和操作字符串艺晴。從源碼可以看到String是被final修飾的所以String是不可被繼承的昼钻,一經(jīng)聲明不得修改,所有的方法都是final方法封寞。同時它還實現(xiàn)了Serializable然评、CharSequence、 Comparable接口狈究。String是由字符數(shù)組組成的碗淌。所以一些常用的字符串基本操作不推薦使用String去完成。
String并不是Java的8大基本類型之一抖锥,這一點(diǎn)很重要亿眠。
二、字符連接
“+”是java提供的雙元運(yùn)算符磅废÷铺剑可用來連接字符串。
public static void main(String[] args) {
String str = "iFillDream";
System.out.println(str + 2017);
}
如果項目需要頻繁連接字符串時还蹲,這種方法就不太明智爹耗。
接下來通過對比實驗來測試以下String耙考、StringBuilder、StringBuffer的速度潭兽;
public static void testStringAdd(){
long startTime = System.nanoTime();
String str = "";
for(int i=0;i<1000;i++){
str += "ifilldream" + "2017";
}
long endTime = System.nanoTime();
System.out.println("String+用時:" + (endTime - startTime) );
}
public static void testStringBuilderAdd(){
long startTime = System.nanoTime();
StringBuilder sb = new StringBuilder();
for(int i=0;i<1000;i++){
sb.append("ifilldream").append(2017);
}
long endTime = System.nanoTime();
System.out.println("StringBuilder用時:" + (endTime - startTime) );
}
public static void testStringBufferAdd(){
long startTime = System.nanoTime();
StringBuffer sb = new StringBuffer();
for(int i=0;i<1000;i++){
sb.append("ifilldream").append(2017);
}
long endTime = System.nanoTime();
System.out.println("StringBuffer用時:" + (endTime - startTime) );
}
通過實驗測試得到以下結(jié)論:
StringBuilder>StringBuffer>String
有人就要問了既然有了StringBuilder類為啥還需要一個StringBuffer類倦始?通過源碼可以得知StringBuilder和StringBuffer用法都是一樣,幾乎沒啥區(qū)別山卦。主要的區(qū)別在于StringBuffer很多成員方法加了synchronized關(guān)鍵字鞋邑,使得StringBuffer是線程安全的,同時導(dǎo)致StringBuffer沒有StringBuilder速度快账蓉。
所以兩者的區(qū)別在于線程安全性和效率上枚碗。此時對于采用StringBuffer和StringBuilder大家就有了答案了。
更多方法請關(guān)注公眾號"輕夢致新"里面會有更多的方法铸本。
三肮雨、面試題
Q1:StringBuilder、StringBuffer箱玷、String的區(qū)別怨规。
- String效率是最慢的,String拼接字符串時會new一個StringBuilder進(jìn)行append操作锡足,隨后使用toString返回波丰,易造成資源浪費(fèi),適用于少量的字符串操作的情況
- StringBuilder 類在 Java 5 中被提出舶得,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的
- StringBuilder和StringBuffer類的對象能夠被多次的修改掰烟,且不產(chǎn)生新的未使用對象,而String則會生成新對象沐批。
- StringBuilder適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
- StringBuffer適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
Q2:以下代碼輸出結(jié)果是什么媚赖?
String a = "iFillDream2017";
String b = "iFillDream" + 2017;
System.out.println((a == b));
答:輸出結(jié)果為true。"iFillDream"+2017在編譯期間就已經(jīng)被優(yōu)化成"iFillDream2017"珠插,因此在運(yùn)行期間惧磺,變量a和變量b指向的是同一個對象。
Q3:以下代碼輸出結(jié)果是什么捻撑?
String a = "iFillDream2017";
String b = "iFillDream";
String c = b + 2017;
System.out.println((a == c));
答:輸出結(jié)果為false磨隘。由于有符號引用的存在,所以 String c = b + 2017;不會在編譯期間被優(yōu)化顾患,不會把b+2017當(dāng)做字面常量來處理的番捂,因此這種方式生成的對象事實上是保存在堆上的。因此a和c指向的并不是同一個對象江解。
統(tǒng)一首發(fā)平臺為-微|信-公|眾-號"輕夢致新"设预,搜索關(guān)注-公|眾-*號,第一時間閱讀最新內(nèi)容犁河。