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í)上就是指針,是指向一個(gè)對(duì)象的內(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";
上述代碼聲明了兩個(gè)基本數(shù)據(jù)類型(int)和兩個(gè)引用數(shù)據(jù)類型(String)。當(dāng)程序執(zhí)行完第②行代碼后,x值為7,x賦值給y,這時(shí)y的值也是7,它們的保持方式如圖1所示,x和y兩個(gè)變量值都是7,但是它們之間是獨(dú)立的,任何一個(gè)變化都不會(huì)影響另一個(gè)。
當(dāng)程序執(zhí)行完第③行時(shí),字符串“Hello”對(duì)象被創(chuàng)建,保持到內(nèi)存地0x12345678中,str1是引用類型變量,它保存的是內(nèi)存地址0x12345678,這個(gè)地址指向“Hello”對(duì)象。
當(dāng)程序執(zhí)行完第④行時(shí),str1變量內(nèi)容(0x12345678)被賦值給str2是引用類型變量,這樣一來str1和str2保存了相同的內(nèi)存地址,都指向“Hello”對(duì)象。見圖1所示,此時(shí)str1和str2本質(zhì)上是引用一個(gè)對(duì)象,通過任何一個(gè)引用都可以修改對(duì)象本身。
當(dāng)程序執(zhí)行完第⑤行時(shí),字符串“World”對(duì)象被創(chuàng)建,保持到內(nèi)存地址0x23455678中,地址保存到str2變量中,此時(shí),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存儲(chǔ)位置的區(qū)別
- 基本變量類型
在方法中定義的非全局基本數(shù)據(jù)類型變量的具體內(nèi)容是存儲(chǔ)在棧中的
- 引用變量類型
只要是引用數(shù)據(jù)類型變量,其具體內(nèi)容都是存放在堆中的,而棧中存放的是其具體內(nèi)容所在內(nèi)存的地址
如圖:
- 基本數(shù)據(jù)類型
引用數(shù)據(jù)類型:
1.3傳遞方式的區(qū)
- 基本變量類型
在方法中定義的非全局基本數(shù)據(jù)類型變量,調(diào)用方法時(shí)作為參數(shù)是按數(shù)值傳遞的
- 引用變量類型
引用數(shù)據(jù)類型變量,調(diào)用方法時(shí)作為參數(shù)是按引用傳遞的,傳遞的是引用的副本
二.String判斷字符串相等
2.1java中字符串的基本存儲(chǔ)原理
- 1.常量池中的字符串僅是符號(hào),第一次用到的時(shí)候才變?yōu)閷?duì)象
- 2.利用串池的機(jī)制,來避免重復(fù)創(chuàng)建字符串對(duì)象
- 3.字符串常量拼接原理是StringBuilder(1.8)
- 4.可以使用intern方法,主動(dòng)將串池中還沒有的字符串放入串池(1.8是放入,1.6是復(fù)制副本放入)
2.2舉例
public class ComPareString { public void test(){ String str1="a";//"a"第一次用到,變?yōu)閷?duì)象 String str2="b"; String str3="a";//判斷str1==str3為true,str1與str2指向的都是在串池中的對(duì)象"a" String str4="ab"; String str5="a"+"b";//判斷str4==str5為true,str4在編譯的過程中就完成了拼接為"ab" // ,與上述同理,與str4所指是同一對(duì)象 String str6=str1+str2;//判斷str4==str6為false,str1與str2為變量,實(shí)際上是 //new StringBuilder().append("a").append("b").toString(),即new String("ab") //新創(chuàng)建了對(duì)象,并不是在串池中的"ab",所以為false String str7=str6.intern();? //將str6字符串對(duì)象放入串池中,如果串池中有就不會(huì)放入,如果沒有就會(huì)放入,最后會(huì)把串池中的對(duì)象返回 //所以str7現(xiàn)在所指的對(duì)象與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)建鏈表錯(cuò)誤點(diǎn)
Node h = new Node(); Node n=new Node(); Node n2=h.next; n2=n; //奇奇怪怪的錯(cuò)誤(捂臉),無論next是null或是非null都不可以這樣寫,n2=n就是把n的引用賦值給了n2,這樣的話n2與h.next就沒有任何關(guān)系了 //正確寫法 n.next=null; h.next=n;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java基于elasticsearch實(shí)現(xiàn)集群管理
這篇文章主要介紹了java基于elasticsearch實(shí)現(xiàn)集群管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02MyBatis typeAliases元素標(biāo)簽(含注解方式)及其屬性、設(shè)置方式
這篇文章主要介紹了MyBatis typeAliases元素標(biāo)簽(含注解方式)及其屬性、設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09深入理解Spring MVC的數(shù)據(jù)轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于Spring MVC數(shù)據(jù)轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。2017-09-09SpringBoot配置開發(fā)環(huán)境的詳細(xì)步驟(JDK、Maven、IDEA等)
文章介紹了如何配置SpringBoot開發(fā)環(huán)境,包括安裝JDK、Maven和IDEA,并提供了詳細(xì)的步驟和配置方法,感興趣的朋友一起看看吧2024-12-12利用Java實(shí)現(xiàn)讀取WPS?Excel中嵌入的圖片
許多數(shù)據(jù)文件中可能包含嵌入式圖片,這些圖片對(duì)于數(shù)據(jù)分析和可視化非常重要,下面我們就來看看如何使用Java讀取WPS?Excel中嵌入的圖片吧2024-11-11Java合并兩個(gè)List后并去掉重復(fù)項(xiàng)的兩種做法
工作中很多時(shí)候需要用到合并兩個(gè)List并去除其中的重復(fù)內(nèi)容,這是一個(gè)很簡單的操作,實(shí)現(xiàn)的方法也多種多樣,這篇文章主要給大家介紹了關(guān)于Java合并兩個(gè)List后并去掉重復(fù)項(xiàng)的兩種做法,需要的朋友可以參考下2023-10-10