Java的引用類型就是用來代替C/C++指針的作用的。引用類型的特點時,對象的名稱不指示對象本身包含的值。對象實際所占用的空間是在堆內存中new出來的,而引用本身的值指向這片空間(從實現上來說引用儲存了地址,作用和C/C++的指針類似,但不像指針壹樣可以轉換為值類型以及參與指針運算,以確保類型安全性)。
Java中數組是引用類型,和C/C++數組還是有類似之處的。例如,傳遞參數時,數組名稱表示地址。同樣,Java中也可以用char數組實現字符串,只不過分配空間的方式和C/C++的不同(Java中new定義的在堆中分配空間,在引用本身被銷毀時,對象成為垃圾,最終被對象收集器自動清理;C/C++中直接定義的數組位於棧或者靜態內存區,生存期結束後會被自動回收;對於字符指針實現的動態字符串,C++中在堆裏面new出來的需要手動delete;C中在堆裏面malloc出來的需要手動free;)。但是,也應該註意區別。C/C++中數組名本身是常量,壹旦定義就不可修改;而Java中數組名是引用,可以像指針壹樣被賦值,指向壹個新的數組或者置為null。(賦值之後,如果原本指向的字符串沒有被繼續引用,那麽會成為垃圾。)
Java中的非匿名的常量字符串指String類的實例。String類是引用類型。對於字符串比較,可以用String類的compareTo方法,傳入要比較的另外壹個String對象的引用。
例如,如果str[0]、str[1]是字符串對象引用/字符數組指針,Java中的str[0].compareTo(str[1])和C/C++的strcmp(str[0],str[1])類似。而equals方法是String從Object類繼承下來的的,只能比較值是否相等,不能像compareTo實現strcmp的返回負值或正值指明比較結果的方向性(字典序比較)。(至於兩個String對象用==比較,判斷這兩個引用是否指向堆內存的同壹個字符串對象,比equals更嚴格。)
如果需要可寫的字符串,用StringBuffer類而不是String類的實例。
LZ的壹些誤解:
string——這個在C++裏面是有的,但是Java裏面應該是String。兩者有些區別,前者是可寫的,後者是只讀的。C++裏面的string相當於Java裏面的StringBuffer。不過這兩者的“多維字符串”表達方式是類似的,因為都是封裝好的類,壹個string/String都表示壹個字符串,而不是如C-style字符串壹樣,引用名稱時(sizeof中除外),只表示首個字符的地址。像str[1][2][3]這樣的用法也是可以實現的,但是要訪問其中字符的話,必須用特定的str數組元素的成員方法:例如str[1][2][3].charAt(x)返回str[1][2][3]中下標為x的char;str[1][2][3].toCharArray(t)這樣可以把str[1][2][3]所含的內容以字符串的形式復制到char數組t中。類似的C-style(這裏是4維字符數組)的用法可以是str[1][2][3][x]、strcpy(t, str[1][2][3]),而C++的string重載了operator[],利用下標訪問看起來和C-style字符串類似(str[1][2][3][x]、strcpy(t, str[1][2][3].c_str())),但原理上更接近Java中的字符類。
多維存儲——語言特性上,C/C++不支持多維數組。所謂的多維數組,實際上只是數組的數組而已。