溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么解析Java性能優(yōu)化中的基本類型與引用類型

發(fā)布時(shí)間:2021-11-26 10:28:39 來源:億速云 閱讀:112 作者:柒染 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么解析Java性能優(yōu)化中的基本類型與引用類型,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

★名詞定義

  先明確一下什么是“基本類型”,什么是“引用類型”。
  簡單地說,所謂基本類型就是 Java 語言中如下的8種內(nèi)置類型:

boolean
char
byte
short
int
long
float
double

  而引用類型就是那些可以通過 new 來創(chuàng)建對象的類型(基本上都是派生自 Object)。

★兩種類型的存儲(chǔ)方式

  這兩種類型的差異,首先體現(xiàn)在存儲(chǔ)方式上。

◇引用類型的創(chuàng)建

  當(dāng)你在函數(shù)中創(chuàng)建一個(gè)引用類型的對象時(shí),比如下面這句:

StringBuffer str = new StringBuffer();

  該 StringBuffer 【對象】的內(nèi)容是存儲(chǔ)在堆(Heap)上的,需要申請堆內(nèi)存。而變量 str 只不過是針對該 StringBuffer 對象的一個(gè)引用(或者叫地址)。變量 str 的【值】(也就是 StringBuffer 對象的地址)是存儲(chǔ)在【棧】上的。

◇基本類型的創(chuàng)建

  當(dāng)你在【函數(shù)中}創(chuàng)建一個(gè)基本類型的變量時(shí),比如下面這句:

int n = 123;

  這個(gè)變量 n 的【值】也是存儲(chǔ)在棧(Stack)上的,但是這個(gè)語句不需要再從堆中申請內(nèi)存了。

  為了更加形象,便于大伙兒理解,簡單畫了一個(gè)示意圖如下:

怎么解析Java性能優(yōu)化中的基本類型與引用類型

★堆和棧的性能差異

  可能有同學(xué)會(huì)小聲問:堆和棧有啥區(qū)別捏?
  要說堆和棧的差別,那可就大了去了。如果你對這兩個(gè)概念還是不太明白或者經(jīng)?;煜?,建議先找本操作系統(tǒng)的書拜讀一下。
  由于是介紹性能,所以來討論一下堆和棧在性能方面的差別(這個(gè)差異是很大滴)。堆相對進(jìn)程來說是全局的,能夠被所有線程訪問;而棧是線程局部的,只能本線程訪問。打個(gè)比方,棧就好比個(gè)人小金庫,堆就好比國庫。你從個(gè)人小金庫拿錢去花,不需要辦什么手續(xù),拿了就花,但是錢數(shù)有限;而國庫里面的錢雖然很多,但是每次申請花錢要打報(bào)告、蓋圖章、辦 N 多手續(xù),耗時(shí)又費(fèi)力。
  同樣道理,由于堆是所有線程共有的,從堆里面申請內(nèi)存要進(jìn)行相關(guān)的加鎖操作,因此申請堆內(nèi)存的復(fù)雜度和時(shí)間開銷比棧要大很多;從棧里面申請內(nèi)存,雖然又簡單又快,但是棧的大小有限,分配不了太多內(nèi)存。

★當(dāng)初為啥這樣設(shè)計(jì)?

  可能有同學(xué)又問了,干嘛把兩種類型分開存儲(chǔ),干嘛不放到一起捏?這個(gè)問題問得好!下面我們就來揣測一下,當(dāng)初 Java 為啥設(shè)計(jì)成這樣。
  當(dāng)年 Java 它爹( James Gosling )設(shè)計(jì)語言的時(shí)候,對于這個(gè)問題有點(diǎn)進(jìn)退兩難。如果把各種東東都放置到棧中,顯然不現(xiàn)實(shí),一來?xiàng)J蔷€程私有的(不便于共享),二來?xiàng)5拇笮∈怯邢薜模齺項(xiàng)5慕Y(jié)構(gòu)也間接限制了它的用途。那為啥不把各種東東都放置到堆里面捏?都放堆里面,倒是能繞過上述問題,但是剛才也提到了,申請堆內(nèi)存要辦很多手續(xù),太繁瑣。如果僅僅在函數(shù)中寫一個(gè)簡單的“int n = 0;”,也要到堆里面去分配內(nèi)存,那性能就大大滴差了(要知道 Java 是1995年生出來的,那年頭俺買了臺(tái) PC 配【4兆內(nèi)存】就屬豪華配置了)。
  左思右想之后,Java 它爹只好做了一個(gè)折中:把類型分為“基本類型”和“引用類型”,兩者使用不同的創(chuàng)建方式。這種差異從 Java 語法上也可以看出來:引用類型總是用 new 創(chuàng)建對象(提醒一下:某些單鍵對象/單例對象,表面上沒用 new,但是在 getInstance() 內(nèi)部也還是用 new 創(chuàng)建的);而基本類型則【不需要】用 new 來創(chuàng)建。

★這樣設(shè)計(jì)的弊端

  順便跑題一下,斗膽評價(jià) Java 它爹這種設(shè)計(jì)的弊端(希望 Java Fans 不要跟我急)。我個(gè)人認(rèn)為:這個(gè)折中的決策,帶來了許多深遠(yuǎn)的影響,隨手舉出幾個(gè)例子:
1、由于基本類型不是派生自 Object,因此不能算是純種的對象。這導(dǎo)致了 Java 的“【純】面向?qū)ο蟆闭信拼蛄苏劭郏ó?dāng)年 Sun 老是吹噓 Java 是“純”O(jiān)O 的語言,其實(shí) Java 的 OO 是不夠純粹滴)。
2、由于基本類型不是派生自 Object,出于某些場合(比如容器類)的考慮,不得不為每個(gè)基本類型加上對應(yīng)的包裝類(比如 Integer、Byte 等),使得語言變得有點(diǎn)冗余。

從上述的介紹,我們應(yīng)該明白,使用 new 創(chuàng)建對象的開銷是【不小】的。在程序中能避免就應(yīng)該盡量避免。另外,使用 new 創(chuàng)建對象,不光是創(chuàng)建時(shí)開銷大,將來垃圾回收時(shí),銷毀對象也是有開銷的

上述就是小編為大家分享的怎么解析Java性能優(yōu)化中的基本類型與引用類型了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI