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