原創(chuàng)聲明:本文為作者原創(chuàng),未經(jīng)允許不得轉(zhuǎn)載,經(jīng)授權(quán)轉(zhuǎn)載需注明作者和出處
記得在Hello_Word那章的時(shí)候,我們用到了這樣一句
System.out.println("Hello_Word");
這個(gè)”Hello_Word”便是我們要講的字符串。
字符串,顧名思義,就是就是把字符串起來,也就是多個(gè)字符的集合。要講字符串,我們先來講講上章提到的字符。
Java用char類型來表示字母、數(shù)字、標(biāo)點(diǎn)符號(hào)以及其他特殊字符,我們?cè)趈ava中表示字符最簡(jiǎn)單的方法是用單引號(hào)嵌入字符,如:
char c = 'a';
當(dāng)然,單引號(hào)中也可以放入單個(gè)的漢字。
字符的本質(zhì)其實(shí)是數(shù)字,因?yàn)槊恳粋€(gè)字符在Unicode標(biāo)準(zhǔn)中都有對(duì)應(yīng)的數(shù)字值,稱為Unicode值,比如小寫的a是97
char c = 97;
System.out.println(c);
這段代碼的運(yùn)行結(jié)果就是小寫的a
當(dāng)然char還可以操作Unicode字符,因?yàn)椴皇呛艹S茫栽诖艘仓皇翘峁└拍罟┎樵儯蛔錾钊胙芯俊?/p>
接下來是開始講字符串了
String str1 = "你好!";
String str2 = new String("你好!");
我們?cè)陔p引號(hào)中可以輸入任何我們想要顯示的東西,不限制長(zhǎng)度,沒有類型,可以是字母,數(shù)字,下劃線,特殊符號(hào),空格等等。String a = "Hello "+"word";
System.out.println(a);
我們還可以連接兩個(gè)變量String a = new String("Hello ");
String b = new String("word");
String c = a + b;
System.out.println(c);
當(dāng)一個(gè)字符串和別的類型的變量拼接起來時(shí),別的類型的變量會(huì)自動(dòng)被強(qiáng)轉(zhuǎn)成字符串,我們來看以下兩段程序:int a = 1;
int b = 2;
System.out.println(a+b);
該程序的運(yùn)行結(jié)果是毫無疑問是3,但是,如果這樣:int a = 1;
int b = 2;
System.out.println(""+a+b);
程序的運(yùn)行結(jié)果卻是12,原來就是1和2被強(qiáng)轉(zhuǎn)成了普通字符串然后被拼接到了一起。String str1 = new String("你好");
String str2 = new String("你好");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
這段代碼運(yùn)行的結(jié)果是false true,造成這個(gè)結(jié)果的原因是:String str1 = "你好";
String str2 = "你好";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
而這段代碼運(yùn)行的結(jié)果是true true,造成這種結(jié)果的原因是:這兩個(gè)變量都是被當(dāng)做基本類型來使用的,沒有通過new關(guān)鍵字來創(chuàng)建的,因此虛擬機(jī)不會(huì)為這兩個(gè)String對(duì)象分配新的內(nèi)存堆,而是到String緩沖池中來尋找。首先為str1尋找String緩沖池內(nèi)是否有與”你好”相同值的String對(duì)象存在,此時(shí)String緩沖池內(nèi)是空的,沒有相同值的String對(duì)象存在,所以虛擬機(jī)會(huì)在String緩沖池內(nèi)創(chuàng)建此String對(duì)象,其動(dòng)作就是new String(“你好”);。然后把此String對(duì)象的引用賦值給str1。然后為str2尋找String緩沖池內(nèi)是否有與”你好”相同值的String對(duì)象存在,此時(shí)虛擬機(jī)找到了一個(gè)與其相同值的String對(duì)象,這個(gè)String對(duì)象其實(shí)就是為str1所創(chuàng)建的String對(duì)象。既然找到了一個(gè)相同值的對(duì)象,那么虛擬機(jī)就不在為此創(chuàng)建一個(gè)新的String對(duì)象,而是直接把存在的String對(duì)象的引用賦值給str2。因?yàn)閟tr1和str2都引用了同一個(gè)內(nèi)存對(duì)象,就是它自己等于自己,因此str1==str2的結(jié)果為true。
上述原理目前只需要了解即可,關(guān)于對(duì)象和指針,我們會(huì)在以后的章節(jié)陸續(xù)講到。
String str1 = null;
System.out.println(str1.equals("你好"));
這段話運(yùn)行結(jié)果會(huì)拋出一個(gè)空指針異常,:Exception in thread "main" java.lang.NullPointerException
原因是str1已經(jīng)是null了,也就是沒有指向任何對(duì)象,既然沒有對(duì)象,我們還要去找這個(gè)對(duì)象里面的方法,自然找不到,所以會(huì)拋出異常。String str1 = null;
System.out.println("你好".equals(str1));
則會(huì)返回false