其實(shí)這兩個(gè)概念并不是很難理解,但是網(wǎng)上很多文章都講得有點(diǎn)復(fù)雜,有的提到用反匯編器來(lái)看程序執(zhí)行過(guò)程,的確這是一個(gè)好辦法,很清楚.但是對(duì)于一個(gè)初學(xué)者來(lái)說(shuō)確實(shí)看不懂,反而還會(huì)使得他覺(jué)得這兩個(gè)概念很難理解,越搞越亂.
下面我就來(lái)說(shuō)下我經(jīng)過(guò)對(duì)網(wǎng)上資料的整理寫(xiě)了一篇對(duì)String和StringBuffer的簡(jiǎn)單看法:
1. String類(lèi)一旦建立是不可修改的??屬于字符串常量[/size]
??
?? StringBuffer類(lèi) 是可以修改的
??
通過(guò)下面這個(gè)例子我們就能很清楚地了解:
public class compare
{
?????? public static void main(String args[])
?????? {
???????????? String s1="a";
???????????? StringBuffer sb1=new StringBuffer("a");
??
???????????? StringBuffer sb2=sb1;
???????????? String s2="a"+"b";
???????????? sb1.append("b");
????
???????????? System.out.println(s1==s2);
???????????? System.out.println(sb1==sb2);
??????????????
???????????? System.out.println(s1);
??
??????????}
}
?????????? 運(yùn)行結(jié)果:
?????????? false
?????????? true
?????????? a
??????這樣我們可以看出來(lái)用String來(lái)聲明的變量是不可變的,即使我們使用了sb1.append("b");這樣一個(gè)語(yǔ)句,但是從輸出結(jié)果可以看出s1仍然是a并沒(méi)有發(fā)生改變。 而StringBuffer聲明的變量是可以改變的所以運(yùn)行結(jié)果是true。
2.對(duì)字符串使用==來(lái)進(jìn)行比較String的特殊性
用==來(lái)比較字符串,與equalse方法不同的是,==不是比較兩個(gè)字符串的值是否相等,而是比較幾個(gè)字符串的引用是否指向同一個(gè)實(shí)例。
public class c2
{
??????????public static void main(String args[])
??????{
??????????String s1="a";
??????????String s2="a";
??????????String s3=new String("a");
??????????String s4=new String("a");
??????????System.out.println(s1==s2);
??????????System.out.println(s3==s4);
??????????System.out.println(s1==s3);
??
??????}
????上面的程序段輸出:
?? true
????false
????false
????????
???????? 與上例進(jìn)行比較,不僅可以看出來(lái)==與equals的區(qū)別,還可以看到字面量的String的特殊之外。
??????對(duì)于字面量的String,只要字符串的值是相等的,不論有多少個(gè)引用都是指向同一塊內(nèi)存,不再另外分配空間。而用new關(guān)鍵字生成的實(shí)例則不同,每當(dāng)用new實(shí)例化一次,分配該實(shí)例自己的內(nèi)存空間。
3.字符串equals()的比較方法
?????? String類(lèi)提供了一些方法,用來(lái)進(jìn)行字符串的比較。這個(gè)類(lèi)實(shí)現(xiàn)了Object父類(lèi)的equals()方法,用來(lái)比較兩種字符串的值是否相等。同時(shí)還增加了equalsIgnoreCase()方法可以忽略?xún)蓚€(gè)字符串大小寫(xiě)的區(qū)別。下面是這兩種方法的例子。
public class b1
{
??????public static void main(String args[])
?? {
???????? String s1="a";
???????? String s2=new String("a");
???????? String s3="A";
???????? System.out.println(s1.equals(s2));
???????? System.out.println(s1.equals(s3));
???????? System.out.println(s1.equalsIgnoreCase(s3));
????}
}
上例的輸出是:
true
flase
true
但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等,如下例所示。
public class b2
{
?????????? public static void main(String args[])
????????????{
???????????????? StringBuffer s1=new StringBuffer("a");
???????????????? StringBuffer s2=new StringBuffer("a");
???????????????? System.out.println(s1.equals(s2));
??
???????????? }
}
程序輸出:false
但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等.
下面我就來(lái)說(shuō)下我經(jīng)過(guò)對(duì)網(wǎng)上資料的整理寫(xiě)了一篇對(duì)String和StringBuffer的簡(jiǎn)單看法:
1. String類(lèi)一旦建立是不可修改的??屬于字符串常量[/size]
??
?? StringBuffer類(lèi) 是可以修改的
??
通過(guò)下面這個(gè)例子我們就能很清楚地了解:
public class compare
{
?????? public static void main(String args[])
?????? {
???????????? String s1="a";
???????????? StringBuffer sb1=new StringBuffer("a");
??
???????????? StringBuffer sb2=sb1;
???????????? String s2="a"+"b";
???????????? sb1.append("b");
????
???????????? System.out.println(s1==s2);
???????????? System.out.println(sb1==sb2);
??????????????
???????????? System.out.println(s1);
??
??????????}
}
?????????? 運(yùn)行結(jié)果:
?????????? false
?????????? true
?????????? a
??????這樣我們可以看出來(lái)用String來(lái)聲明的變量是不可變的,即使我們使用了sb1.append("b");這樣一個(gè)語(yǔ)句,但是從輸出結(jié)果可以看出s1仍然是a并沒(méi)有發(fā)生改變。 而StringBuffer聲明的變量是可以改變的所以運(yùn)行結(jié)果是true。
2.對(duì)字符串使用==來(lái)進(jìn)行比較String的特殊性
用==來(lái)比較字符串,與equalse方法不同的是,==不是比較兩個(gè)字符串的值是否相等,而是比較幾個(gè)字符串的引用是否指向同一個(gè)實(shí)例。
public class c2
{
??????????public static void main(String args[])
??????{
??????????String s1="a";
??????????String s2="a";
??????????String s3=new String("a");
??????????String s4=new String("a");
??????????System.out.println(s1==s2);
??????????System.out.println(s3==s4);
??????????System.out.println(s1==s3);
??
??????}
????上面的程序段輸出:
?? true
????false
????false
????????
???????? 與上例進(jìn)行比較,不僅可以看出來(lái)==與equals的區(qū)別,還可以看到字面量的String的特殊之外。
??????對(duì)于字面量的String,只要字符串的值是相等的,不論有多少個(gè)引用都是指向同一塊內(nèi)存,不再另外分配空間。而用new關(guān)鍵字生成的實(shí)例則不同,每當(dāng)用new實(shí)例化一次,分配該實(shí)例自己的內(nèi)存空間。
3.字符串equals()的比較方法
?????? String類(lèi)提供了一些方法,用來(lái)進(jìn)行字符串的比較。這個(gè)類(lèi)實(shí)現(xiàn)了Object父類(lèi)的equals()方法,用來(lái)比較兩種字符串的值是否相等。同時(shí)還增加了equalsIgnoreCase()方法可以忽略?xún)蓚€(gè)字符串大小寫(xiě)的區(qū)別。下面是這兩種方法的例子。
public class b1
{
??????public static void main(String args[])
?? {
???????? String s1="a";
???????? String s2=new String("a");
???????? String s3="A";
???????? System.out.println(s1.equals(s2));
???????? System.out.println(s1.equals(s3));
???????? System.out.println(s1.equalsIgnoreCase(s3));
????}
}
上例的輸出是:
true
flase
true
但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等,如下例所示。
public class b2
{
?????????? public static void main(String args[])
????????????{
???????????????? StringBuffer s1=new StringBuffer("a");
???????????????? StringBuffer s2=new StringBuffer("a");
???????????????? System.out.println(s1.equals(s2));
??
???????????? }
}
程序輸出:false
但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等.