分享:SringBuffer与String的区别
·作為Java中最為基礎的部分,在Java的學習過程中,就一定會學習到字符串,其中String類作為字符串。并且在Java所有的程序中是使用字符串都是使用String類去實現。
兩者存在一定的通性,都是可以儲存和操作字符串,即包含多個字符的字符串數據。
但是StringBuffer與Sting的區別在哪里?
下面將講述Sting與StringBuffer最為關鍵的區別之處在哪里?
1、從字符串的內容是否可以被修改上
String:字符串作為常量;則有一個這樣的通性,它們的值在創建之后不能更改。在字符串的數組中,String對象是不可以改變的,這是因為存在這樣的缺點也是具有一個與眾不同的有點,編譯器可以把字符串設立為共享。
下面是String的表達式:
String str = "abc";
等效于:
char data[] = {'a','b','c'};
String str = new String(data);
StringBuffer:StringBuffer類作為一個不同之處及優點在輔助類,可以在使用之前預先分配指定長度的內存塊建立一個字符串緩沖區,這樣的效益比String中需要每次都要開辟一個內存空間優于很多。StringBuffer是線程安全的,在多線程程序中也可以很方便去使用,但是相對于線程不安全的效率要稍低一點。
2、從對象本身的改變上
每次對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象。
每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。
而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度并不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的。如以下的例子:
?String S1 = “This is only a” + “ simple” + “ test”;
? StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
? 你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優勢。其實這是 JVM 的一個把戲,在 JVM 眼里,這個
? String S1 = “This is only a” + “ simple” + “test”; 其實就是:
? String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。
?
基于以上兩點區別,在大部分情況下,StringBuffer > String
下面介紹一下StringBuffer中經常使用到的幾種方法:
1、append方法
public StringBuffer append(boolean b)
該方法的作用是追加內容到當前StringBuffer對象的末尾,類似于字符串的連接。調用該方法以后,StringBuffer對象的內容也發生改變,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
則對象sb的值將變成”abctrue”。
使用該方法進行字符串的連接,將比String更加節約內容,例如應用于數據庫SQL語句的連接,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
這樣對象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
2、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
該方法的作用是刪除指定位置的字符,然后將剩余的內容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
該代碼的作用刪除字符串對象sb中索引值為1的字符,也就是刪除第二個字符,剩余的內容組成一個新的字符串。所以對象sb的值變為”Tst”。
還存在一個功能類似的delete方法:
public StringBuffer delete(int start,int end)
該方法的作用是刪除指定區間以內的所有字符,包含start,不包含end索引值的區間。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
該代碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字符,剩余的字符形成新的字符串。則對象sb的值是”TString”。
3、insert方法
public StringBuffer insert(int offset, String s)
該方法的作用是在StringBuffer對象中插入內容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,“false”);
該示例代碼的作用是在對象sb的索引值4的位置插入字符串false,形成新的字符串,則執行以后對象sb的值是”TestfalseString”。
4、reverse方法
public StringBuffer reverse()
該方法的作用是將StringBuffer對象中的內容反轉,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
經過反轉以后,對象sb中的內容將變為”cba”。
5、setCharAt方法
public void setCharAt(int index, char ch)
該方法的作用是修改對象中索引值為index位置的字符為新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
則對象sb的值將變成”aDc”。
6、trimToSize方法
public void trimToSize()
該方法的作用是將StringBuffer對象的中存儲空間縮小到和字符串長度一樣的長度,減少空間的浪費。
7、構造方法:
StringBuffer s0=new StringBuffer();分配了長16字節的字符緩沖區
StringBuffer s1=new StringBuffer(512);分配了512字節的字符緩沖區
8、獲取字符串的長度: length()
StringBuffer s = new StringBuffer("www");
int i=s.length();
m.返回字符串的一部分值
substring(int start) //返回從start下標開始以后的字符串
substring(int start,int end) //返回從start到 end-1字符串
9.替換字符串
replace(int start,int end,String str)
s.replace(0,1,"qqq");
10.轉換為不變字符串:toString()。
轉載于:https://www.cnblogs.com/Zhuoshengda/p/7214264.html
總結
以上是生活随笔為你收集整理的分享:SringBuffer与String的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 步步为营(十六)搜索(二)BFS 广度优
- 下一篇: 数据结构与算法JavaScript描述—