藍橋杯軟體學院講堂:Java性能優化,基本類型 vs 引用類型

2021-02-20 藍橋杯

請點擊上面藍橋杯  免費訂閱!

今天藍橋杯軟體學院鄭老師為大家分享Java性能優化,基本類型 vs 引用類型。希望大家能夠喜歡:

在Java性能優化系列中,內存管理是一個要優先考慮的關鍵因素。而說到內存分配,就必然會涉及到基本類型和引用類型。所以我們今天就先來介紹一下這兩種類型在性能方面各自有什麼奧妙。

  ★名詞定義
  先明確一下什麼是基本類型,什麼是引用類型。簡單地說,所謂基本類型就是Java語言中如下的8種內置類型:boolean、char、byte、 short、int、long、float、double。而引用類型就是那些可以通過new來創建對象的類型(基本上都是派生自Object)。

  ★兩種類型的存儲方式
  這兩種類型的差異,首先體現在存儲方式上。
  ◇引用類型的創建
  當你在函數中創建一個引用類型的對象時,比如下面的語句:
  StringBuffer str = new StringBuffer();
  該StringBuffer對象的內容是存儲在堆(Heap)上的,需要申請堆內存。而變量str只不過是針對該StringBuffer對象的一個引用(或者叫地址)。變量str的(也就是StringBuffer對象的地址)是存儲在棧上的。
  ◇基本類型的創建
  當你在函數中創建一個基本類型的變量時,比如如下語句:
  int n = 123;
  這個變量n的也是存儲在棧(Stack)上的,但是這個語句不需要再從堆中申請內存了。



  ★堆和棧的性能差異
  可能有同學會小聲問:堆和棧有啥區別捏?要說堆和棧的差別,那可就大了去了。如果你對這兩個概念還是不太明白或者經常混淆,建議先找本作業系統的書拜讀一下。
  由於本系列是介紹性能,所以來討論一下堆和棧在性能方面的差別(這個差異是很大滴)。堆相對進程來說是全局的,能夠被所有線程訪問;而棧是線程局部的,只能本線程訪問。打個比方,棧就好比個人小金庫,堆就好比國庫。你從個人小金庫拿錢去花,不需要辦什麼手續,拿了就花,但是錢數有限;而國庫裡面的錢雖然很多,但是每次申請花錢要打報告、蓋圖章、辦N多手續,耗時又費力。
  同樣道理,由於堆是所有線程共有的,從堆裡面申請內存要進行相關的加鎖操作,因此申請堆內存的複雜度和時間開銷比棧要大很多;從棧裡面申請內存,雖然又簡單又快,但是棧的大小有限,分配不了太多內存。

  ★為什麼這樣設計?
  可能有同學又問了,幹嘛把兩種類型分開存儲,幹嘛不放到一起捏?這個問題問得好!下面我們就來揣測一下,當初Java為啥設計成這樣。
  當年Java它爹(James Gosling)設計語言的時候,對於這個問題有點進退兩難。如果把各種東東都放置到棧中,顯然不現實,一來棧是線程私有的(不便於共享),二來棧的大小是有限的,三來棧的結構也間接限制了它的用途。那為啥不把各種東東都放置到堆裡面捏?都放堆裡面,倒是能繞過上述問題,但是剛才也提到了,申請堆內存要辦很多手續,太繁瑣。如果僅僅在函數中寫一個簡單的「int n = 0;」,也要到堆裡面去分配內存,那性能就大大滴差了(要知道Java是1995年生出來的,那年頭我家的PC配4兆內存就屬豪華配置了)。
  左思右想之後,Java它爹只好做了一個折中:把類型分為基本類型和引用類型,兩者使用不同的創建方式。這種差異從Java語法上也可以看出來:引用類型可以用new創建對象(對於某些單鍵,表面上沒用new,但是在getInstance()內部也還是用的new);而基本類型則不需要用new來創建。

  ★這樣設計的弊端
  順便跑題一下,鬥膽評價Java它爹這種設計的弊端(希望Java Fans不要跟我急)。我個人認為:這個折中的決策,帶來了許多深遠的影響,隨手舉出幾個例子:
  1、由於基本類型不是派生自Object,因此不能算是純種的對象。這導致了Java的「面向對象」招牌打了折扣(當年Sun老是吹噓Java是OO的語言)。
  2、由於基本類型不是派生自Object,出於某些場合(比如容器類)的考慮,不得不為每個基本類型加上對應的包裝類(比如Integer、Byte等),使得語言變得有點冗餘。

  ★結論
  從上述的介紹,我們應該明白,使用new創建對象的開銷是不小的。在程序中能避免就應該儘量避免。另外,使用new創建對象,不光是創建時開銷大,將來垃圾回收時,銷毀對象也是有開銷的.

如果大家還不明白的話,歡迎大家參加藍橋杯軟體學院的免費實訓計劃。


藍橋杯軟體學院由線下企業級軟體培訓及在線教育兩部分組成。線下,通過高校合作、共建校內實訓基地,專注培養具備網際網路思維,精通Java、ios、android等主流技術的優秀技術人才。線上,提供豐富、實用、前沿的泛IT領域培訓內容,幫助IT人士個人成長及終身學習,打造泛IT領域人士的卓越學習平臺。

藍橋杯軟體學院基地風採

想了解更多藍橋杯軟體學院信息,請點擊下方閱讀原文,即可跳轉到我們的網頁。

============================

分享最光榮!輕擊屏幕右上方即刻分享!

或微信查找"bluebridgecup」關注我們!

掃一掃下方二維碼關注我們也是極好的!

相關焦點

  • 藍橋杯軟體學院講堂:13道Java典型的Java小程序
    點擊標題下方關注藍橋杯,免費訂閱。 今天藍橋杯軟體學院鄭老師為大家分享13道Java典型的Java小程序。希望大家能夠喜歡:1、設計一個java程序,從鍵盤接收兩個整數,找出其中的較大的數。2、設計一個java程序,從鍵盤接收一個字符串,反序輸出。3、設計一個Java程序,判斷鍵盤輸入的一個年份是否為閏年。若是閏年列印「是」,否則列印「否」。閏年的判斷方法:能被100整除的年份如能被400整除方為閏年;其它年份如能被4整除,即為閏年。
  • Java基本數據類型與引用數據類型概述
    以0x開頭 【16 = 10】注意:只有JDK1.7版本以上可以使用0b2 來表示二進位基本數據類型分類(4類8種)整數型:byte 佔一個字節 -2^7 ~ 2^7-1【-128~中boolean類型沒有明確指定他的大小基本數據類型定義的注意事項1、賦值時候注意float類型,long類型,加大寫的F和L2、作用域問題:同一個區域不能使用相同的變量名3、初始化值問題:局部變量在使用之前必須賦值
  • Java基本數據類型
    華清遠見成都中心高端IT就業培訓專家java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。
  • Java基本數據類型的簡單介紹
    各位小夥伴們大家好,這次小編要介紹的是java的基本數據類型,其實之前寫常量的時候,就已經提到了數據類型。數據類型主要分為兩種,一種是基本數據類型,第二種是引用數據類型。小編這次要介紹的是基本數據類型。
  • Java的八種基本數據類型是哪些
    任何程式語言都離不開數據結構,java也不例外,在java的世界裡,數據都有自己的數據類型,而且不同的數據類型有不同的特性。概念Java 語言是一種強類型語言。第一、所有的變量必須先聲明、後使用。第二、指定類型的變量只能接受和聲明的類型匹配的類型值。強類型語言的好處是在編譯階段就可以發現原始碼的錯誤,從而保證程序更加健壯。但也有缺點,有時程序運行中難以確定其類型,面對這種業務場景java的強類型就有些死板,索性後期java又推出了泛型彌補這個缺失。兩者配合實現動靜皆宜。不論如何,強類型語言的優點還是大於劣勢的。又出來一個新名詞,泛型?
  • Java基礎學習:java中的基本數據類型
    一、基本類型 1、基本類型 不使用New創建,聲明一個非引用傳遞的變量,且變量的值直接置於堆棧中,大小不隨運行環境變化,效率更高。使用new創建的引用對象存儲在堆中。
  • java之ArrayList集合存儲基本數據類型
    各位小夥伴們大家好,這次小編要介紹的是,在ArrayList集合當中,基本數據類型的存儲,在之前的文章中小編有提到過,ArrayList集合只能存儲引用數據類型,其實也可以存儲基本數據類型。在ArrayList集合當中,如果要存儲基本數據類型需要用到基本數據類型相對應的包裝類(包裝類是引用數據類型,位於java.long包下,不需要導包)。小編先插入一個表格,來介紹基本數據類型與包裝類的對應關係。小編覺得,關於基本數據類型相對應的包裝類,其實大部分只需要首字母大寫就可以。int型還有char型比較特殊,這兩個需要大家簡單記一下。
  • 「乾貨」基本數據類型和引用數據類型的區別
    背景新語言Kotlin已經拋棄了Java裡的基本數據類型,而是採用引用類型去聲明一個變量,那麼怎麼區分基本數據類型和引用類型呢?文字概念基本數據類型:byte、short、int、long、float、double、char、boolean引用類型:類(class)、接口(interface)、數組(array
  • Java性能優化的50個細節(珍藏版)
    3、儘量避免過多過常地創建Java對象儘量避免在經常調用的方法,循環中new對象,由於系統不僅要花費時間來創建對象,而且還要花時間對這些對象進行垃圾回收和處理,在我們可以控制的範圍內,最大限度地重用對象,最好能用基本的數據類型或數組來替代對象。
  • Java 性能優化的那些事兒
    儘量處理好包裝類型和基本類型兩者的使用場所雖然包裝類型和基本類型在使用過程中是可以相互轉換,但它們兩者所產生的內存區域是完全不同的,基本類型數據產生和處理都在棧中處理,包裝類型是對象,是在堆中產生實例。在集合類對象,有對象方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。7.
  • 提升java編程性能優化知識 程式設計師必看這幾點
    對於學習java的學子也是如此,那麼java程式設計師如何提高編程性能呢,有哪些小知識或者技巧呢,怎麼樣才能在編程性能優化方面有所提升呢?  1.儘量在合適的場合使用單例  使用單例可以減輕加載的負擔,縮短加載的時間,提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面:
  • 必會的55個Java性能優化細節!一網打盡!
    3、儘量避免過多過常地創建Java對象儘量避免在經常調用的方法,循環中new對象,由於系統不僅要花費時間來創建對象,而且還要花時間對這些對象進行垃圾回收和處理,在我們可以控制的範圍內,最大限度地重用對象,最好能用基本的數據類型或數組來替代對象。
  • Java性能優化的50個細節,我必須分享給你!
    儘量處理好包裝類型和基本類型兩者的使用場所雖然包裝類型和基本類型在使用過程中是可以相互轉換,但它們兩者所產生的內存區域是完全不同的,基本類型數據產生和處理都在棧中處理,包裝類型是對象,是在堆中產生實例。在集合類對象,有對象方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。7.
  • 一起學JAVA——數據類型
    上一篇我們提到過,java是強數據類型語言,所有在定義變量和常量時必須指定數據類型。java到底支持哪些數據類型呢?,如果我們程序中需要運算的值超出基本數據類型的取值範圍怎麼辦呢?由於他的存儲結構和基本數據不一樣,基本數據類型是按位存儲的,而他們是用字符串來存儲數據的,所以理論上可以存儲無窮大的數。但他們的缺點就是不能用算數操作符進行算(如:+,- ,*,/)但他們提供的對應的方法,結果和直接用操作符一樣。
  • JAVA脫水學習——3.java數據類型
    JAVA 數據類型分兩大類,基本數據類型和引用數據類型。其中基本數據類型包括:整形、浮點型、字符型、布爾型;引用數據類型包括:數組、類、接口。Java 把內存分為棧和堆,棧用來保存局部變量,如基本數據類型,類的實例;堆用來保存動態產生的數據,如 new 創建的引用類型。
  • java基礎案例之java語言組成和數據類型與強制類型轉換語法
    java數據類型定義變量格式:數據類型 變量名 =初始化值;例如:int x =4;java擁有不同類型運算時,會自動提升上一級類型。如:byte b=3;b=b+2; //前者b是byte類型,後者2是int類型。
  • 一文詳解 Java 的八大基本類型!
    自從Java發布以來,基本數據類型就是Java語言中重要的一部分,本文就來詳細介紹下每種基本類型的具體使用方法和限制。首先,我來介紹一下有關Java 8中的基本類型。如題所述,Java語言本身有8種基本類型。在下面幾節中,就讓我們一起來看看這8種基本類型。我將針對每種基本類型,介紹具體的使用方法和限制。
  • 面試中經常被問到 Java 引用類型原理,帶你深入剖析
    Java中一共有4種引用類型(其實還有一些其他的引用類型比如FinalReference):強引用、軟引用、弱引用、虛引用。
  • Java四種引用類型:強引用、軟引用、弱引用、虛引用
    作者:CodeBear的園子來源:www.cnblogs.com/CodeBear/p/12447554.htmlJava中有四種引用類型
  • Java內存分配和String類型的深度解析
    一、引題在java語言的所有數據類型中,String類型是比較特殊的一種類型,同時也是面試的時候經常被問到的一個知識點,本文結合java內存分配深度分析關於String的許多令人迷惑的問題。下面是本文將要涉及到的一些問題,如果讀者對這些問題都了如指掌,則可忽略此文。1、java內存具體指哪塊內存?這塊內存區域為什麼要進行劃分?是如何劃分的?