Java中String 和StringBuffer的区别
先看下面的這個例子,讀懂這個例子,你就理解了。
publicclass?Test?{??
publicstaticvoid?stringReplace?(String?text)?{??
???text?=?text.replace('j'?,?'i');???
???}??
publicstaticvoid?bufferReplace?(StringBuffer?text)?{??
???text?=?text.append("C");???
???}??
publicstaticvoid?main?(String?args[])?{???
????String?textString?=?new?String?("java");???
????StringBuffer?textBuffer?=?new?StringBuffer?("java");???
????stringReplace?(textString);???
????bufferReplace?(textBuffer);???
????System.out.println?(textString?+?textBuffer);???
????}???
????} ?
答案是 javajavaC
這是String參數傳遞,是不可變的(immutable).
而題目中第七行text = text.append (“C”),append方法會改變text中的值
而這個text與main中的textBuffer是指向同一個對象,所以對應的輸出是javac。
string的值永遠不會改變!
String a = "a";//假設a指向地址0x0001,
a = "b";//重新負值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經不再是a所指向的。
從表面上看String類型的對象改變了值,但事實是他不能改變值,只能改變指向的地址
StringBuffer則不同,直接改變指向的地址中保留的值
還有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//為什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//為什么是true
StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類,
而Object類中的equals方法是用來比較地址的,所以等于false.
String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以會是
true。
對于這樣能不能面試出真正的水平,感到懷疑。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
String str=new String("HELLO");
String str="HELLO";
以上的區別請說明以下
String str=new String("HELLO");創建了兩個對象,一個是"HELLO",然后再用"HELLO"創建一個str引用的對象.
下面的就在創建"HELLO"之后把str指向"HELLO",這樣只創建了一個String的實例
~~~~~~~~~~~~~~~~~~~~~~~~~
因此得到的結論是:如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!
也許這就是你的程序的性能瓶頸!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
非可變對象一旦創建之后就不能再被改變,可變對象則可以在創建之后被改變。
String對象是非可變對象,StringBuffer對象則是可變對象。
為獲得更佳的性能你需要根據實際情況小心謹慎地選擇到底使用這兩者中的某一個
一、StringBuffer的equals方法沒有覆蓋Object的方法,所以StringBuffer a=new StringBuffer("ss");StringBuffer b=new StringBuffer("ss");,生成了兩個對象,
a.equals(b)=false,比較的是地址。
二、等號比較的是地址,String a = "a";String b=a;只生成了一個對象a==b true。
StringBuffer a=new StringBuffer("a");StringBuffer b = a; 也是生成一個對象a==b true。
三、String a="ss";String b="ss"; a.equals(b)=true a==b true因為也是一個對象。這是因為編譯時只產生了一個對象"ss"。String a=new String("ss");String b=new String("ss");a.equals(b)=true,沒有疑問,a==b false。因為a,b是在運行時才產生的對象,產生了2個對象。
總結
以上是生活随笔為你收集整理的Java中String 和StringBuffer的区别的全部內容,希望文章能夠幫你解決所遇到的問題。