Java 字符串拼接 StringBuilder() StringBuffer
| ? | ? |
| ? | ? |
字符串拼接
普通方式
public class StringDemo2 {public static void main(String[] args) {// 表示獲取從1970-01-01 00:00:00到現(xiàn)在的毫秒值long begin = System.currentTimeMillis();// 拼接字符串家,將100000個a拼接在一起String str = "";for (int i = 0; i < 100000; i++) {str += "a";}long end = System.currentTimeMillis();System.out.println(end - begin);}}運行結(jié)果:
2496運行結(jié)果是程序運行的時間(ms),我們可以看到運行這個程序用了近2.5s。
程序解析:
這種字符串拼接方式是創(chuàng)建一個新的字符串,然后將原來的字符串和將要拼接的字面量拼接起來賦給新的字符串。
這個過程中會不斷創(chuàng)建新的新的字符串,所以回耗費大量時間,同時創(chuàng)建太多的新字符串會占用大量的內(nèi)存,可能會導(dǎo)致方法區(qū)內(nèi)存溢出。
如果是數(shù)據(jù)量較少的話可以使用該方法,數(shù)據(jù)量過多不建議使用。
StringBuilder(JDK5.0)
StringBuilder:字符串變量(非線程安全)。在內(nèi)部,StringBuilder 對象被當(dāng)作是一個包含字符序列的變長數(shù)組。
java.lang.StringBuilder 是一個可變的字符序列,是 JDK5.0 新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。
其構(gòu)造方法如下:
| 構(gòu)造方法 | 描述 |
| StringBuilder() | 創(chuàng)建一個容量為16的StringBuilder對象(16個空元素) |
| StringBuilder(CharSequence cs) | 創(chuàng)建一個包含cs的StringBuilder對象,末尾附加16個空元素 |
| StringBuilder(int initCapacity) | 創(chuàng)建一個容量為initCapacity的StringBuilder對象 |
| StringBuilder(String s) | 創(chuàng)建一個包含s的StringBuilder對象,末尾附加16個空元素 |
?
?
?
?
?
?
在大部分情況下,StringBuilder > StringBuffer。這主要是由于前者不需要考慮線程安全。
public class StringDemo2 {public static void main(String[] args) {// 表示獲取從1970-01-01 00:00:00到現(xiàn)在的毫秒值long begin = System.currentTimeMillis();StringBuilder sb = new StringBuilder();for (int i = 0; i < 100000000; i++) {sb.append("a");}String str = sb.toString();long end = System.currentTimeMillis();System.out.println(end - begin);}}運行結(jié)果:
891從結(jié)果中我們可以看出雖然操作的數(shù)據(jù)增多,但是程序運行的時間卻大大縮短。
整個程序運行過程中只創(chuàng)建了3的對象
StringBuffer(JDK1.0)
StringBuffer:字符串變量(Synchronized,即線程安全)。如果要頻繁對字符串內(nèi)容進行修改,出于效率考慮最好使用 StringBuffer,如果想轉(zhuǎn)成 String 類型,可以調(diào)用 StringBuffer 的 toString() 方法。
Java.lang.StringBuffer 線程安全的可變字符序列。在任意時間點上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容??蓪⒆址彌_區(qū)安全地用于多個線程。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。
- append 方法始終將這些字符添加到緩沖區(qū)的末端;
- insert 方法則在指定的點添加字符。
例如,如果 z 引用一個當(dāng)前內(nèi)容是 start 的字符串緩沖區(qū)對象,則此方法調(diào)用 z.append("le") 會使字符串緩沖區(qū)包含 startle ,而 z.insert(4, "le") 將更改字符串緩沖區(qū),使之包含 starlet 。
StringBuffer 方法
以下是 StringBuffer 類支持的主要方法:
| 1 | public StringBuffer append(String s) 將指定的字符串追加到此字符序列。 |
| 2 | public StringBuffer reverse() ?將此字符序列用其反轉(zhuǎn)形式取代。 |
| 3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
| 4 | public insert(int offset, int i) 將 int 參數(shù)的字符串表示形式插入此序列中。 |
| 5 | replace(int start, int end, String str) 使用給定 String 中的字符替換此序列的子字符串中的字符。 |
?
?
?
?
?
?
?
?
?
?
實例:
public class Test6{public static void main(String args[]){StringBuffer str = new StringBuffer("All say:");str.append("I ");str.append("love ");str.append("cjj");System.out.println(str); } }運行結(jié)果:
All say:I love cjj三者區(qū)別
String 類型和 StringBuffer 的主要性能區(qū)別:String 是不可變的對象, 因此在每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因為每次生成對象都會對系統(tǒng)性能產(chǎn)生影響,特別當(dāng)內(nèi)存中無引用對象多了以后, JVM 的 GC 就會開始工作,性能就會降低。
使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。所以多數(shù)情況下推薦使用 StringBuffer ,特別是字符串對象經(jīng)常改變的情況下。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chuijingjing/p/9489229.html
總結(jié)
以上是生活随笔為你收集整理的Java 字符串拼接 StringBuilder() StringBuffer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 事件机制
- 下一篇: 关于python文件问题