??由于是第一篇博客,首先介紹一下自己吧,博主是某高校研究生,方向是醫療軟件開發(本科是生物方向),剛開始學編程半年,一直想寫博客卻又怕才疏學淺,遲遲未敢動筆,但是丑媳婦總要見公婆,今天終于狠狠心寫了第一篇博客,如有錯誤希望大家多多指正。
??首先科普一下java類型的有關知識,JAVA中類型可以分為兩大類,基本類型和引用類型,基本類型有9大類:
| 基本類型 | 大小 | 最小值 | 最大值 | 包裝器類型 |
|---|---|---|---|---|
| boolean | - | - | - | Boolean |
| char | 16 bit | Unicode 0 | Unicode 2^16-1 | Character |
| byte | 8 bits | -128(-2^7) | 127(2^7-1) | Byte |
| short | 16 bits | -2^15 | 2^15-1 | Short |
| int | 32 bits | -2^31 | 2^31-1 | Integer |
| long | 64 bits | -2^63 | 2^63-1 | Long |
| float | 32 bits | - | 有效數字6位 | Float |
| double | 64 bits | - | 有效數字15位 | Double |
| void | - | - | - | Void |
??除了這9個基本類型之外則都是引用類型,基本類型和引用類型的變量都存儲于棧上,那么基本類型跟引用類型的區別是什么呢?區別在于基本類型的數據(值)也存儲于棧上,基本類型的變量直接存儲值;而引用類型的數據(對象)存儲于堆上,引用類型的變量存儲的是數據的地址;所以基本變量是值傳遞,引用變量是地址傳遞(實際上也是值的傳遞,不過是地址值),這也是為什么基本類型可以直接用“==“比較,而類一般要根據需要重寫equals方法來進行的比較。
??基本類型并不包括String,說明String是一個引用類型,但是為什么網上有那么多對String類型的爭論呢?首先看下面一段代碼:
public static void main(String[] args) { String A = "hello"; String B = "hello"; System.out.PRintln(A==B);//true B = A; B ="world"; System.out.println(A);//"hello"??很奇怪是不是?String的表現完全像一個基本類型,這是為什么呢? ??首先介紹String對象的兩種創建方法:1,String A = “hello ?? ?? ?? ?? ?? ?? ?? ??????2,String A = new String(“hello”) ?? 那么這兩種方法有什么區別呢?方法1要調用字符串常量池,而方法2會忽略掉字符串常量池。 ??字符串常量池位于堆上,當使用方法1時,當需要創建一個新的字符串的時候(不用new),會自動去常量池找是否有相同的字符串,如果有就直接引用,沒有就重新創建一個對象并放入池中。 ??當創建A時,字符串常量池中沒有“hello”,所以就創建了一個字符串對象”hello”;
當創建B時,字符串常量池中有“hello”,所以就直接把B指向字符串對象“hello”; ??此時A和B都指向同一個”hello”(即引用變量A,B儲存的都是字符串對象”hello”的地址),故A==B為true;
??B = A,確保B和A共同引用一個對象;B=“world”,常量池中無“world”字符串對象,重新創建,并將B指向“world”字符串對象。所以A自然還是指向“hello”,如圖所示。
??那么且看下面一段代碼:
String A = new String("hello"); String B = "hello"; System.out.println(A==B);//false??你看,A和B是不是都指向“hello”對象,但是他們卻并不是指向同一個“hello”對象,原因就是用了new,new略過了字符串常量池,直接創建“hello”字符串對象,導致B在字符串常量池中沒有找到“hello”對象,重新創建了一個,所以A和B并不是指向同一個對象。

新聞熱點
疑難解答