Java數(shù)據(jù)類型之引用數(shù)據(jù)類型解讀
Java數(shù)據(jù)類型之引用數(shù)據(jù)類型
在Java中除了8種基本數(shù)據(jù)類型外,其他數(shù)據(jù)類型全部都是引用(reference)數(shù)據(jù)類型,引用數(shù)據(jù)類型用來表示復(fù)雜數(shù)據(jù)類型,如下圖所示,包含:類、接口和數(shù)組聲明的數(shù)據(jù)類型。
引用數(shù)據(jù)類型:有類,接口,數(shù)組等。
Java中的引用數(shù)據(jù)類型,相當(dāng)于C等語言中指針(pointer)類型,引用事實(shí)上就是指針,是指向一個對象的內(nèi)存地址。引用數(shù)據(jù)類型變量中保持的是指向?qū)ο蟮膬?nèi)存地址。
很多資料上提到Java不支持指針,事實(shí)上是不支持指針計(jì)算,而指針類型還是保留了下來,只是在Java中稱為引用數(shù)據(jù)類型。
int x = 7; int y = x; String str1 = "Hello"; String str2 = str1; str2 = "World";
上述代碼聲明了兩個基本數(shù)據(jù)類型(int)和兩個引用數(shù)據(jù)類型(String)。當(dāng)程序執(zhí)行完第②行代碼后,x值為7,x賦值給y,這時y的值也是7,它們的保持方式如圖1所示,x和y兩個變量值都是7,但是它們之間是獨(dú)立的,任何一個變化都不會影響另一個。
當(dāng)程序執(zhí)行完第③行時,字符串“Hello”對象被創(chuàng)建,保持到內(nèi)存地0x12345678中,str1是引用類型變量,它保存的是內(nèi)存地址0x12345678,這個地址指向“Hello”對象。
當(dāng)程序執(zhí)行完第④行時,str1變量內(nèi)容(0x12345678)被賦值給str2是引用類型變量,這樣一來str1和str2保存了相同的內(nèi)存地址,都指向“Hello”對象。見圖1所示,此時str1和str2本質(zhì)上是引用一個對象,通過任何一個引用都可以修改對象本身。
當(dāng)程序執(zhí)行完第⑤行時,字符串“World”對象被創(chuàng)建,保持到內(nèi)存地址0x23455678中,地址保存到str2變量中,此時,str1和str2不再指向相同內(nèi)存地址,見圖2所示。
圖一:引用數(shù)據(jù)類型賦值過程1

圖二:引用數(shù)據(jù)類型賦值過程2

java理解引用數(shù)據(jù)類型
一.java中基礎(chǔ)數(shù)據(jù)類型與引用數(shù)據(jù)類型的區(qū)別
1.1基礎(chǔ)數(shù)據(jù)類與引用數(shù)據(jù)類型介紹
1.基礎(chǔ)數(shù)據(jù)類型:
- ①整數(shù)類型:
long、int、short、byte - ②浮點(diǎn)類型:
float、double - ③字符類型:
char - ④布爾類型:
boolean
2.引用數(shù)據(jù)類型:類、 接口類型、 數(shù)組類型、 枚舉類型、 注解類型、 字符串型,例:String類型就是引用類型。
1.2存儲位置的區(qū)別
- 基本變量類型
在方法中定義的非全局基本數(shù)據(jù)類型變量的具體內(nèi)容是存儲在棧中的
- 引用變量類型
只要是引用數(shù)據(jù)類型變量,其具體內(nèi)容都是存放在堆中的,而棧中存放的是其具體內(nèi)容所在內(nèi)存的地址
如圖:
- 基本數(shù)據(jù)類型
引用數(shù)據(jù)類型:
1.3傳遞方式的區(qū)
- 基本變量類型
在方法中定義的非全局基本數(shù)據(jù)類型變量,調(diào)用方法時作為參數(shù)是按數(shù)值傳遞的

- 引用變量類型
引用數(shù)據(jù)類型變量,調(diào)用方法時作為參數(shù)是按引用傳遞的,傳遞的是引用的副本

二.String判斷字符串相等
2.1java中字符串的基本存儲原理
- 1.常量池中的字符串僅是符號,第一次用到的時候才變?yōu)閷ο?nbsp;
- 2.利用串池的機(jī)制,來避免重復(fù)創(chuàng)建字符串對象
- 3.字符串常量拼接原理是StringBuilder(1.8)
- 4.可以使用intern方法,主動將串池中還沒有的字符串放入串池(1.8是放入,1.6是復(fù)制副本放入)
2.2舉例
public class ComPareString { public void test(){ String str1="a";//"a"第一次用到,變?yōu)閷ο? String str2="b"; String str3="a";//判斷str1==str3為true,str1與str2指向的都是在串池中的對象"a" String str4="ab"; String str5="a"+"b";//判斷str4==str5為true,str4在編譯的過程中就完成了拼接為"ab" // ,與上述同理,與str4所指是同一對象 String str6=str1+str2;//判斷str4==str6為false,str1與str2為變量,實(shí)際上是 //new StringBuilder().append("a").append("b").toString(),即new String("ab") //新創(chuàng)建了對象,并不是在串池中的"ab",所以為false String str7=str6.intern();? //將str6字符串對象放入串池中,如果串池中有就不會放入,如果沒有就會放入,最后會把串池中的對象返回 //所以str7現(xiàn)在所指的對象與str4是一樣的,str4與str6不相等,故判斷str6==str7為false String s8=new String("abc"); String s9=s8.intern();//判斷s8==s9,如果jdk為1.8則為true,如果jdk為1.6則為false }}三.java創(chuàng)建鏈表錯誤點(diǎn)
Node h = new Node(); Node n=new Node(); Node n2=h.next; n2=n; //奇奇怪怪的錯誤(捂臉),無論next是null或是非null都不可以這樣寫,n2=n就是把n的引用賦值給了n2,這樣的話n2與h.next就沒有任何關(guān)系了 //正確寫法 n.next=null; h.next=n;
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java.try catch finally 的執(zhí)行順序說明
這篇文章主要介紹了Java.try catch finally 的執(zhí)行順序說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
springboot?log4j2.xml如何讀取application.yml中屬性值
這篇文章主要介紹了springboot?log4j2.xml如何讀取application.yml中屬性值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java如何導(dǎo)入Jsoup庫做一個有趣的爬蟲項(xiàng)目
Jsoup庫是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫做一個有趣的爬蟲項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2023-11-11
Springboot之如何統(tǒng)計(jì)代碼執(zhí)行耗時時間
這篇文章主要介紹了Springboot之如何統(tǒng)計(jì)代碼執(zhí)行耗時時間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

